使用SQLite加载多个CSV文件



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

请注意,一开始我使用Oracle,但由于Oracle每个表有1000列的限制,而我的CSV文件每个表有1500多列,我不得不找到另一个解决方案。我不想尝试SQLite,因为我可以快速轻松地安装它。这些CSV文件已经提供了大量的列,我无法更改或拆分它们(不管为什么(。

请告知。

我遇到了一个类似的问题,对你的问题的评论实际上给了我最终对我有效的答案

步骤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从不将文件名作为标头写入。

请确保将all_combined.csv放在一个单独的文件夹中,或者在某些发行版中,它将被递归包含

要加载到SQLite(步骤2(,Hot Licks给出的答案对我有效:

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

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

我没有找到更好的方法来解决这个问题,所以我使用了findxargs来避免创建一个巨大的中间.csv文件:

find . -type f -name '*.csv' | xargs -I% sqlite3 database.db ".mode csv" ".import % new_table" ".exit"

find打印出文件名,xargs-I%参数使命令之后的每行运行一次,%被csv文件名替换。

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文件包含列标签的初始行,则该行将作为数据读取并插入到表中。要避免这种情况,请确保该表以前不存在。


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

您可以使用DB Browser for SQLite轻松完成这项工作。文件>导入>CSV文件中的表。。。然后选择所有文件,将它们一起打开到一个表中。

我刚刚用十几个CSV文件测试了这一点,并在没有任何工作的情况下从中得到了一个1GB的表。只要它们具有相同的模式,DB Browser就能够将它们放在一起。您需要选中"第一行中的列名"选项。

最新更新