Как вывести схему из CSV, содержащего столбцы из списка значений - PullRequest
0 голосов
/ 23 июня 2019

Команда csvsql csvkit, похоже, не обрабатывает столбцы, содержащие списки значений. какой другой инструмент или техника будут делать эту работу?

Готов преобразовать IMDB CSV-файлов в схему SQL, Я пытался использовать команду csvsql из csvkit, но csvsql, кажется, игнорирует список значений в том смысле, что он выбирает простой chararray формат imdb csv описан здесь

практично, когда я пытаюсь извлечь схему из name.basics.tsv какой контент выглядит так:

nconst  primaryName birthYear   deathYear   primaryProfession   knownForTitles
nm0000001   Fred Astaire    1899    1987    soundtrack,actor,miscellaneous  tt0053137,tt0043044,tt0072308,tt0050419
nm0000002   Lauren Bacall   1924    2014    actress,soundtrack  tt0038355,tt0037382,tt0117057,tt0071877
nm0000003   Brigitte Bardot 1934    \N  actress,soundtrack,producer tt0059956,tt0057345,tt0054452,tt0049189
nm0000004   John Belushi    1949    1982    actor,writer,soundtrack tt0080455,tt0072562,tt0077975,tt0078723
nm0000005   Ingmar Bergman  1918    2007    writer,director,actor   tt0069467,tt0083922,tt0050986,tt0050976

с помощью следующей команды:

gunzip -c name.basics.tsv.20190622232803.gz | sed 's/\\N//g' | csvsql -t --blanks -i postgresql --db-schema imdb > name.basics.tsv.20190622232803.sql

В результате получается следующая команда sql schema:

CREATE TABLE stdin (
    nconst VARCHAR NOT NULL, 
    "primaryName" VARCHAR NOT NULL, 
    "birthYear" VARCHAR NOT NULL, 
    "deathYear" VARCHAR NOT NULL, 
    "primaryProfession" VARCHAR NOT NULL, 
    "knownForTitles" VARCHAR NOT NULL
); 

primaryProfession не рассматривается как массив, список или перечисление. Более того, столбец knownForTitles ссылается на список индексов других таблиц, Вот title.crew.tsv:

tconst  directors   writers
tt0000001   nm0005690    
tt0057232   nm0592807,nm0514816 nm1431954
tt0057233   nm2479905   nm0096831,nm0101595,nm1637529
tt0057234   nm0419967   nm0419967,nm0633315
tt0057235   nm0294758   nm0294758,nm0610842,nm0919041
tt0057236   nm0511837   nm0509563,nm0511837
tt0057237   nm0927090   nm0927090 

Я бы заменил известный столбец ForTitles выделенной таблицей "actor_title" многие ко многим, между именами и title.crew.

но может ли любой инструмент справиться с этим автоматически?

...