使用SQLite加载多个CSV文件

时间:2015-01-17 21:55:24

标签: sqlite csv

我正在使用SQLite,我需要将数百个CSV文件加载到一个表中。我没有在网上找到这样的东西。有可能吗?

请注意,在开始时我使用的是Oracle,但由于Oracle每个表有1000列限制,而我的CSV文件每列有超过1500列,我必须找到另一个解决方案。我不想尝试SQLite,因为我可以快速轻松地安装它。 这些CSV文件已经提供了诸如列数,我无法更改或拆分它们(没关系为什么)。

请告知。

2 个答案:

答案 0 :(得分:1)

http://www.sqlite.org/cli.html -

使用“.import”命令将CSV(逗号分隔值)数据导入SQLite表。 “.import”命令接受两个参数,这些参数是要从中读取CSV数据的磁盘文件的名称,以及要将CSV数据插入其中的SQLite表的名称。

请注意,在运行“.import”命令之前将“mode”设置为“csv”非常重要。这是防止命令行shell尝试将输入文件文本解释为其他格式所必需的。

sqlite> .mode csv
sqlite> .import C:/work/somedata.csv tab1

有两种情况需要考虑:(1)表“tab1”以前不存在,(2)表“tab1”已存在。

在第一种情况下,当表先前不存在时,将自动创建表,并使用输入CSV文件的第一行的内容来确定表中所有列的名称。换句话说,如果表先前不存在,则CSV文件的第一行将被解释为列名,而实际数据将从CSV文件的第二行开始。

对于第二种情况,当表已经存在时,CSV文件的每一行(包括第一行)都被假定为实际内容。如果CSV文件包含列标签的初始行,则该行将作为数据读取并插入表中。为避免这种情况,请确保该表先前不存在。


请注意,您需要确保文件没有定义字段名称的初始行。而且,对于“数百”文件,您可能需要准备一个脚本而不是单独输入每个文件。

答案 1 :(得分:1)

我遇到了类似的问题,对您问题的评论实际上为我提供了最终对我有用的答案

步骤1:将多个csv合并到一个文件中。排除其中大多数文件的标题,但从一开始就记下其中一个文件的标题。

第2步:将单个合并的csv加载到SQLite中。

对于步骤1,我使用了:

$ head -1 one.csv > all_combined.csv
$ tail -n +2 -q *.csv >> all_combined.csv

第一个命令仅写入csv文件的第一行(您可以选择一个文件),第二个命令从第2行开始写入整个文档,因此不包括标题。 -q选项可确保tail从不将文件名写为标题。

要载入SQLite(第2步),Hot Licks给出的答案对我有用:

 sqlite> .mode csv
 sqlite> .import all_combined.csv my_new_table

这假设尚未创建my_new_table。另外,您可以先创建然后加载,但在这种情况下,请从步骤1中排除标题。