在这篇文章中,我问了一个问题,如何让我的脚本读取CSV标头和自动引用字符串值;即自动包装那些数据类型为字符串并且需要"字符串"的列"以便插入到SQL表中。显然,这将超出Bash所能处理的范围?
无论如何,我欢迎任何关于如何使以下脚本工作的帮助:在这里,我有基本相同的脚本,但我尝试手动定义单独的列,并将它们分配给变量,col3是字符串列,因此被引用。不用说,它并没有完成我想要它做的事情(即,为col3下的所有字符串数据提供引号(。谢谢
#!/bin/bash
echo Path to to-be-imported CSV:
read csv_file
echo Table name to import into:
read table
echo "INSERT INTO $table VALUES" > SQL_INSERT_$table.txt
while read col1 col2 col3 col4
do
echo "($col1 $col2 "$col3" $col4),"
done < <(tail -n +2 $csv_file) >> SQL_INSERT_$table.txt && sed -i '' '$ s/.$/;/' SQL_INSERT_$table.txt
给定以下csv文件:
/tmp.csv:
Year,Make,Model,Description,Price
1997,Ford,E350,moon,-3000.00
1997,Ford,E350,moon,3000.00
1999,Chevy,Venture Extended Edition,,4900.00
1999,Chevy,Venture Extended Edition Very Large,,5000.00
代码:
awk -F, 'OFS=FS {for (i=1;i<=NF;i++) {if (match($i, /^[0-9.-]+$/)==0) {printf """ $i """} else {printf $i}; if (i<NF) printf OFS}; printf "n"}' /tmp/csv
它输出:
所有字符串类型的值都被引用。
"Year","Make","Model","Description","Price"
1997,"Ford","E350","moon",3000.00
1999,"Chevy","Venture Extended Edition","",4900.00
1999,"Chevy","Venture Extended Edition Very Large","",5000.00
代码基于以下假设:
- 字段值中没有文本分隔符(此处为逗号(
- 字段值中没有文本换行符
- 整数或十进制字段不存在空值
如果这些假设不能代表您的数据,您可能需要这样的CSV解析器。异常字段值应该被很好地引用,否则,即使是解析器也不知道该怎么做
BTW:除非你的数据很简单,行号也很少,否则这不是处理数据的推荐方法。许多DBMS都有一个导入/加载实用程序,可以在程序中使用它来完成这样的工作。