如何在 Bash 脚本中自动引用 SQL 插入语句的 "string values"

How to auto-quote "string values" of a SQL INSERT STATEMENT in Bash script

我写了一个简单的 Bash 脚本,它从完全由整数组成的 CSV 数据中为多行生成一个 SQL INSERT STATEMENT 并将其保存到一个文本文件中(这样我就可以复制并将其粘贴到我想要的任何位置)。

现在我想知道如何自动引用字符串值;即自动包装那些数据类型为字符串的 CSV 列,并且需要“”才能插入 SQL table。正如您在下面看到的,脚本读取整个 CSV 行并且不会区分列。我是否必须将每一列分配给一个变量,然后分别引用字符串?或者有没有更有效的方法?无论哪种方式,如果看到您对上述问题的修复,我将不胜感激!

#!/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 line
do
 echo "($line),"
done < <(tail -n +2 $csv_file) >> SQL_INSERT_$table.txt && sed -i '' '$ s/.$/;/' SQL_INSERT_$table.txt

这是成功自动引用字符串列的上述脚本的修改版本:

#!/bin/bash

# Prompt for input and: 1. enter CSV path to be imported into DB; 2. its equivalent table name in the DB 
echo Path to CSV:
read CSV_file
echo DB table name to import into:
read DB_table

# Create .txt file that will contain SQL INSERT STATEMENT and enter DB table name
echo "INSERT INTO $DB_table VALUES" > SQL_INSERT_$DB_table.txt

# Auto-quote string columns in the .txt file, leaving other columns intact
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"}' $CSV_file > temp.txt

# read-while loop to populate INSERT STATEMENT row values from CSV (2nd row to the end) and replace final comma with semicolon for those RDBMS's that require a concluding semicolon at the end of SQL STATEMENT
while read line
do
 echo "($line),"
done < <(tail -n +2 temp.txt) >> SQL_INSERT_$DB_table.txt && sed -i '' '$ s/.$/;/' SQL_INSERT_$DB_table.txt

# Delete temporary .txt file that contained auto-quoted string values
rm temp.txt

这是脚本的更完整的版本,它不仅自动引用字符串列而且将列名列在SQL插入语句:

#!/bin/bash

# Prompt for input and: 1. enter CSV path to be imported into DB; 2. its equivalent table name in the DB 
echo Path to CSV:
read CSV_file
echo DB table name to import into:
read DB_table

# Create .txt file that will contain SQL INSERT STATEMENT and enter DB table name
echo "INSERT INTO $DB_table (" > SQL_INSERT_$DB_table.txt

# List out CSV header as INSERT STATEMENT column names and append to .txt file
echo "`head -n 1 $CSV_file`)" >> SQL_INSERT_$DB_table.txt

# Auto-quote string columns in the .txt file, leaving other columns intact
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"}' $CSV_file > temp.txt
echo "VALUES" >> SQL_INSERT_$DB_table.txt

# read-while loop to populate INSERT STATEMENT row values from CSV (2nd row to the end) and replace final comma with semicolon for those RDBMS's that require a concluding semicolon at the end of SQL STATEMENT
while read line
do
 echo "($line),"
done < <(tail -n +2 temp.txt) >> SQL_INSERT_$DB_table.txt && sed -i '' '$ s/.$/;/' SQL_INSERT_$DB_table.txt

# Delete temporary .txt file that contained auto-quoted string values
rm temp.txt