导入CSV到SQLite


117

我正在尝试将csv文件导入SQLite表。

范例csv:

1,2
5,6
2,7

示例命令:

sqlite> create table foo(a, b);
sqlite> .separator ,
sqlite> .import test.csv foo
Error: test.csv line 1: expected 2 columns of data but found 4

我什至不知道为什么会找到包含六段数据和两列的四列。


似乎该命令期望第一行中的列标题,并且行终止符不能被这样识别。6 - 2 = 4
Mechanical_meat

我可以指定一个行终止符,还是csv中缺少行终止符?
莫莉·沃尔特斯

1
您似乎无法从SQLite命令行工具中指定行终止符。您是否有文本编辑器(例如Windows上的记事本,但更好),可以显示行结束符?主要有三个变体:\r\n在Windows上,\n在* nix(包括较新的Mac)上,\r在较旧的Mac上。
mechanical_meat

我正在使用BBEdit,但在行尾没有看到这些字符。我尝试手动添加它们,但是它似乎没有任何作用……
Molly Walters 2013年

1
该网站可以将CSV(或Excel)文件转换为SQLite-converttosqlite.com
Code Slinger

Answers:


153

在评论中还说了什么,SQLite看到您的输入为1、25、62、7。我也遇到了问题,在我的情况下,通过将“ separator”更改为“ .mode csv”可以解决此问题。因此,您可以尝试:

sqlite> create table foo(a, b);
sqlite> .mode csv
sqlite> .import test.csv foo

第一条命令为表创建列名。但是,如果您希望列名称从csv文件继承,则可以忽略第一行。


83
对于通过搜索落入此处的其他用户,如果csv文件的第一行包含列名,则可以省略第一个create table命令,而sqlite将使用csv文件中的列名。
EarlCrapstone 2015年

2
@EarlCrapstone:您能详细说明吗?它似乎对我不起作用。
d33tah 2016年

3
@ d33tah看这些例子。注意第一行如何包含列名Year,Make,Model,Description,Price而不是实际数据。如果您的CSV文件就是这种情况,那么您无需使用create table命令手动创建表。该.import命令将使用文件中的第一行来确定列名并相应地创建表。您仍然必须在命令中包括表的名称来自SQLite文档的相同信息。
EarlCrapstone '16

你为什么要设置.mode?那不只是为了输出吗?
艾伦(Alan)

如果发现生成的表将多个列组合在一起,请检查您是否没有使用保留字,例如typeCSV列名。
paulvs 16-10-15

29

这是我的方法。

  • 制作/转换要由制表符(\ t)分隔的csv文件,并且不要将其括在任何引号中(sqlite会逐字解释引号-表示旧文档)
  • 输入需要添加数据的数据库的sqlite shell

    sqlite> .separator "\t" ---IMPORTANT! should be in double quotes sqlite> .import afile.csv tablename-to-import-to


对于多行,我的tsv需要使用此命令指定ROW分隔符 .separator "\t" "\r"
mfink 2016年

1
在讨论文件格式时,tsv!= csv参见tools.ietf.org/html/rfc4180
Alan

24

我正在根据自己的经验将先前答案中的信息合并。最简单的方法是将逗号分隔的表头直接添加到csv文件中,然后添加新行,然后添加所有csv数据。

如果您再也没有做过sqlite的工作了(像我一样),则可以为您节省一两个网络搜索:

在Sqlite shell中输入:

$ sqlite3 yourfile.sqlite
sqlite>  .mode csv
sqlite>  .import test.csv yourtable
sqlite>  .exit

如果您的Mac上尚未安装Sqlite,请运行

$ brew install sqlite3

您可能需要进行一次网络搜索以了解如何安装Homebrew。


1
如何处理unescaped " character警报?
TMOTTM

如果在导入之前创建表,则它将不查找标题。
罗尔夫'18

我必须将文件放在sqlite3.exe所在的文件夹中。我可以使用其他路径保存csv文件吗?
Jaydeep Karena

关键点:“如果您的Mac上尚未安装Sqlite” ...默认情况下已安装AFAIK。
Laryx Decidua

8

在.import命令之前,键入“ .mode csv”


5
.mode仅用于输出
DeliriumTremens 2015年

9
显然不是这样。在.import doc部分中:请注意,在运行“ .import”命令之前,将“ mode”设置为“ csv”非常重要。这是防止命令行外壳尝试将输入文件文本解释为其他格式所必需的。
理查德-Rogue Wave Limited

8

如何将csv文件导入sqlite3

  1. 建立资料库

    sqlite3 NYC.db
  2. 设置模式和表名

    .mode csv tripdata
  3. 将CSV文件数据导入到sqlite3

    .import yellow_tripdata_2017-01.csv tripdata
  4. 查找表

    .tables
  5. 查找表架构

    .schema tripdata
  6. 查找表数据

    select * from tripdata limit 10;
  7. 计算表中的行数

    select count (*) from tripdata;


3

我遇到了完全相同的问题(在OS X Maverics 10.9.1和SQLite3 3.7.13上,但我认为SQLite与原因无关)。我尝试导入从MS Excel 2011中保存的csv数据。用途';'为列隔板。我发现Excel中的csv文件仍然使用Mac OS 9中的换行符,将其更改为Unix换行即可解决该问题。AFAIR BBEdit为此提供了一个命令,以及Sublime Text 2。


2
它更易于使用tr -s '\r' '\n',并且可以处理各种随机文件。
Donal Fellows 2014年


0

正如一些网站和其他文章所指定的,其简单的外观对此。 https://www.sqlitetutorial.net/sqlite-import-csv/

我们不需要为csv文件指定分隔符,因为csv表示以逗号分隔。 sqlite> .separator ,不需要这条线。

sqlite> create table cities(name, population);
sqlite> .mode csv
sqlite> .import c:/sqlite/city_no_header.csv cities

这将完美地工作:)

PS:我的city.csv标头。


name,population
Abilene,115930
Akron,217074
Albany,93994
Albuquerque,448607
Alexandria,128283
Allentown,106632
Amarillo,173627
Anaheim,328014

2
不要忘记.save someFileName最后运行。我花了小时才找到这最后在内存中的数据库文件导出此磁盘😅
ioopl
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.