使用以下脚本,
- 我读文件
- 每一行
- 生成 SQL 片段
#!/bin/bash
CURRDATE=$(date +'%Y-%m-%d %H:%M:%S')
echo $CURRDATE
echo $OUTPUT
echo "SET SESSION AUTOCOMMIT = 0;" > $OUTPUT
echo 'START TRANSACTION;' >> $OUTPUT
echo $'INSERT INTO ...' >> $OUTPUT
echo 'VALUES' >> $OUTPUT
cat $INPUT | tr -d '\r' | while IFS= read -r LINE; do
echo $"(..., '$LINE', ...)," >> $OUTPUT
done
echo "COMMIT;" >> $OUTPUT
输出如下所示,
SET SESSION AUTOCOMMIT = 0;
START TRANSACTION;
SET @created_at = '2024-08-09 09:30:45';
INSERT INTO ...
VALUES
(...),
(...),
(...), -- <<<<<<<<<<<<<<<< should be a semi-colon
COMMIT;
如何取消最后一个逗号?这样我就可以用分号了?
awk
一旦你了解了如何操作,这是一件非常简单的事情。我使用它来将任何项目列表“sqlify”为 SQL 友好的列表。您可以调整BEGIN
和END
部分以添加您在值列表之前(和之后)所需的额外语句和其他前言:使用示例:
逻辑是:
,
这样做的结果是,因为我们在每个值后面的行上打印逗号,所以最后一个值没有打印逗号。
在我的示例中,我输入一个值列表并输出一个带引号、以逗号分隔的列表。如果您不需要添加引号,请
printf
相应地修改该行。(该gsub
行将正确转义值中的任何强引号,以便 SQL 能够执行预期/预期的操作)我相信这会满足你的要求:
echo 的 -n 表示输出后不包括换行符。
DopeGhoti 的 sqlifier 的 Perl 等效版本:
单行版本:
-l
:autochomp / autoappend 输入记录分隔符(\n
)-0777
:一次读取整个文件/STDIN-F'\n'
:将输入字段分隔符设置为换行符,并在输入字段分隔符上自动分割整个文件/STDIN;打开自动循环-e "[...]"
:对于每个字段,将单引号替换为双单引号,将结果字符串括在单引号中;使用,
作为分隔符连接所有字段并打印结果字符串,括在括号中注意:在旧版本的 Perl 中,可能需要添加
-a
和-n
开关(以打开自动分割和自动循环);在Perl 5.20.0 或更新版本中,两者都由 暗示-F
。