通过shellscript将CSV导入SQLite,主键和重复数据问题

时间:2012-10-11 19:47:55

标签: sql sqlite shell csv

我有两个这样的简单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数据库。听起来很简单,但我无法让它发挥作用。最后我想得到这样一张桌子:

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';

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

1 个答案:

答案 0 :(得分: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;

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