SQLite3:无法在Mac上导入CSV

时间:2017-03-10 21:29:00

标签: csv sqlite

我是sqlite3的新手,我正在尝试使用我手上的一些数据。

我目前遇到的问题是我甚至无法在shell中创建表格。我正在尝试运行

.mode csv
.import filename tab1

但是我收到了这个错误

CREATE TABLE tab1(...) failed: duplicate column name: B-

由于我正在导入一个.csv文件,我想也许我的列名中有一个副本,但它们似乎都与我截然不同。有人能指出我正确的方向吗?我真的很感激: - )

以下是我的.csv文件的简短摘录:

SID,Name,Cohort,Email,Gender,Ethnicity,Major,Grades,More grades,Last grades,Not sure,,
24239361,name1,Cohort 1-Fall 2013,name1@email.com,Female,Chinese,CS,B,C+,B-,B-,,
24474707,name2,Cohort 1-Fall 2013,name2@email.com,Male,Chinese,CS,B,B+,B-,B-,,
24266062,name3,Cohort 1-Fall 2013,name3@email.com,Male,White,CS,B-,B-,C,B ,,

更新: 编辑我的csv文件现在只有:

SID,Name,Cohort
24239361,Name1,Cohort 1-Fall 2013
24474707,Name2,Cohort 1-Fall 2013
24266062,Name3,Cohort 1-Fall 2013
22181134,Name4,Cohort 1-Fall 2013

当我导入它并执行.schema时,我得到了这个:

CREATE TABLE foo(
"SID" TEXT,
"Name" TEXT,
24239361" TEXT,
"Name1" TEXT,
24474707" TEXT,l 2013
"Name2" TEXT,
24266062" TEXT,l 2013
"Name3" TEXT,
22181134" TEXT,l 2013
"Name4" TEXT,
 24527147" TEXT,l 2013

这真的很奇怪,因为我正在跳过标题栏“同类群组”,而是将以下所有行读到列

2 个答案:

答案 0 :(得分:2)

sqlite3工具要求CSV文件中的换行符为CR + LF(在RFC 4180中指定)。

您的文件如下所示:

00000000: 53 49 44 2c 4e 61 6d 65 2c 43 6f 68 6f 72 74 0d  SID,Name,Cohort.
00000010: 32 34 32 33 39 33 36 31 2c 41 6c 6c 69 73 6f 6e  24239361,Xxxxxxx
00000020: 20 43 6f 72 69 6e 6e 65 20 59 65 65 2c 43 6f 68   Xxxxxxx Xxx,Coh
00000030: 6f 72 74 20 31 2d 46 61 6c 6c 20 32 30 31 33 0d  ort 1-Fall 2013.
00000040: 32 34 34 37 34 37 30 37 2c 41 6e 74 68 6f 6e 79  24474707,Xxxxxxx
...

此文件包含Mac行结尾(仅CR),该文件对普通文本文件有效。

您可以在设置CSV模式后手动更改行分隔符:

.mode csv
.sep , \r

答案 1 :(得分:1)

我无法重现您的问题完全,但是当我尝试使用您的示例数据时,我得到以下不完全相同的错误:

CREATE TABLE tab1(...) failed: duplicate column name:

原因是你的第一行末尾的那两个逗号(代表新表的列)。 SQLite尝试使用空白名称创建两个列,并在第二个列上失败。解决方案是从文件的每一行中删除这些逗号,或者为这些字段提供有效的列名。

我无法专门重现您的问题,但看起来SQLite由于某种原因没有看到第一行,并且正在尝试根据下一行(其中包含多个字段)设置列值B-,导致与上述相同的问题)。你需要追踪发生这种情况的原因。或者,您可以先创建表,然后在导入之前从文件中删除列标题行:

CREATE TABLE tab1 (SID INTEGER, Name TEXT, ...);
.mode csv
.import filename tab1