【问题标题】:Import CSV to SQLite via shellscript, issues with primary key and duplicate data通过 shellscript 将 CSV 导入 SQLite,主键问题和重复数据
【发布时间】:2012-10-02 13:50:42
【问题描述】:

我有两个像这样的简单 CSV 文件,都非常简单并且格式相同:

NAME,NUMBER
abcd,1
qwerty,2
oiujkl,5

csv1 和 csv2 中的许多名称是相同的,但也有仅存在于 csv1 或仅存在于 csv2 中的名称。 csv1 和 csv2 中的数字,例如1,2,3,4,5,6...在两个文件中都存在,但在每个文件中只存在一次。

我想以“name,number-from-csv1,number-from-csv2”的格式将这两个文件导入一个 SQLite db。这听起来很简单,但我无法让它工作。最后我想得到这样一张桌子:

NAME,NUMBER-FROM-CSV1,NUMBER-FROM-CSV2
abcd,1,1
qwerty,2,5
oiujkl,5,10
lkjsie,,99
wero,234,

我缺少 SQL 逻辑 :( 我创建的 SQLite 表如下:

CREATE TABLE IF NOT EXISTS testdb (name TEXT PRIMARY KEY, number-from-csv1 INTEGER UNIQUE, number-from-csv2 INTEGER UNIQUE)

我的 shell 脚本如下所示:

while IFS=',' read -r name number-from-csv1; do
    echo "INSERT INTO testdb (name, number-from-csv1) VALUES('$name', '$number-from-csv1');" 
done < file1.csv

我这样称呼这个脚本:“./import.sh | sqlite3 asinfo.sqlite”。这适用于导入一个文件。如果我只是将“1”更改为“2”来导入 file2,它只会导入 file1 中未列出的名称。然后我尝试运行这个 SQL 查询:

UPDATE testdb SET number-from-csv2='$number-from-csv2' WHERE name='$name';

但这不起作用。有什么想法吗?

【问题讨论】:

    标签: sql sqlite shell csv


    【解决方案1】:

    考虑将每种文件类型上传到其自己的表中。然后使用连接或视图来生成您想要的表格。

    将数据从 csv1 上传到名为 t1 的表中。 t1 具有名称和值列。将 csv2 上传到 t2。 t2 具有列名称和值。

    现在做类似的事情

    select t1.name, t1.value v1, t2.value v2
      from t1
      join t2 on t1.name = t2.name
     order by name;
    

    您可以从此查询创建视图。

    【讨论】:

    • 谢谢马沃!但这似乎仅适用于两个 csv 文件中存在的名称。仅存在于 file1 或仅存在于 file2 的名称不在该视图中。
    • SQL 中有不同种类的“连接”。听起来您想要一个“完全外连接”(在上述查询中将“连接”一词替换为“完全外连接”。)这描述了一些不同类型的连接。您可以玩弄它们以获得所需的结果。 codinghorror.com/blog/2007/10/…
    • 谢谢,但 SQLite 中没有“完全外连接”。我找到了一种使用两个 LEFT JOIN 和一个 UNION 来归档相同内容的方法。这是有效的:从 csv1 中选择 csv1.name、csv1.csv1number、csv2.csv2number 左外连接 csv2 on csv1.name = csv2.name UNION SELECT csv2.name、csv1.csv1number、csv2.csv2number 从 csv2 LEFT OUTER JOIN csv1 ON csv1.name = csv2.name;现在我可以将文件导入到两个表中,发出这个复杂的查询来导出数据并将新的 CSV 再次导入到新的 SQLite db :) 它有效!但我觉得这不是最好的选择...... :)
    猜你喜欢
    • 2014-08-18
    • 1970-01-01
    • 2013-04-06
    • 2017-05-25
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    相关资源
    最近更新 更多