如何将字符串列分配给变量并在 Bash 脚本的输出中引用它

How to assign a string column to variable and have it quoted in output in Bash script

在这个 中,我问了一个关于如何让我的脚本读取 CSV header 和 auto-quote 的问题字符串值;即自动包装那些数据类型为字符串的列,并且需要“”才能插入 SQL table。显然,这将超出 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

代码基于以下假设:

  • 字段值中没有文字分隔符(此处为逗号)。
  • 字段值中没有文字换行符。
  • 整数或小数字段没有空值。

如果这些假设不代表您的数据,您可能需要像 this 这样的 CSV 解析器。并且异常的字段值应该被很好地引用,否则,即使是解析器也不知道该怎么做。

BTW:除非你的数据很简单,行数很少,否则不推荐这种操作数据的方式。许多 DBMS 都有一个 import/load 实用程序,可以在程序中使用它来完成这样的工作。