如何从包含由值列表构成的列的csv推断架构

时间:2019-06-23 08:46:53

标签: sql database-design csvkit

csvkit的csvsql命令似乎无法处理包含值列表的列。 还有什么其他工具或技术可以完成这项工作?

要将imdb csv files转换为sql模式, 我尝试使用csvkit中的csvsql命令, 但csvsql似乎忽略了列表值,因为它正在选择一个简单的chararray here

描述了imdb csv格式

实际上,当我尝试从中提取架构时 名称.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模式命令:

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 

我将在namebasics和title.crew之间用专用的“多对多”“ actor_title”表替换“ knownForTitles”列。

但是任何工具都能自动神奇地处理吗?

0 个答案:

没有答案