将 SQL 插入脚本转换为 CSV 格式
Transform SQL insert script into CSV format
我正在寻找 awk
命令或类似工具,以将格式良好的标准 SQL 插入脚本转换为 csv 文件。
按照标准,我的意思是任何地方都没有数据库供应商特定的东西。
我所说的格式良好是指 sql 脚本的每一行都有一个完整的列集要插入,即使有 NULL。插入字段的顺序也是相同的。
示例输入 SQL 脚本:
INSERT INTO tbl VALUES (1, 'asd', 923123123, 'zx');
INSERT INTO tbl VALUES (1, NULL, 923123123, 'zxz');
INSERT INTO tbl VALUES (3, 'asd3', 923123123, NULL);
可选:
INSERT INTO tbl (colA, colB, colC, colD) VALUES (1, 'asd', 923123123, 'zx');
预期输出应该是一个 csv 文件:
1,'asd',923123123,'zx'
1,,923123123,'zxz'
3,'asd3',923123123,
寻找性能高效的解决方案。
用 GNU grep 和 sed 试试这个:
grep -oP '\(\K[^)]*(?=\);)' file | sed 's/NULL//g;s/ //g'
所有四行的输出:
1,'asd',923123123,'zx'
1,,923123123,'zxz'
3,'asd3',923123123,
1,'asd',923123123,'zx'
或仅使用 GNU sed:
sed 's/.*(\([^)]*\));//;s/NULL//g;s/ //g' file
所有四行的输出:
1,'asd',923123123,'zx'
1,,923123123,'zxz'
3,'asd3',923123123,
1,'asd',923123123,'zx'
$ awk -F' *[(),]+ *' -v OFS=, '{for (i=2;i<NF;i++) printf "%s%s", ($i=="NULL"?"":$i), (i<(NF-1)?OFS:ORS)}' file
1,'asd',923123123,'zx'
1,,923123123,'zxz'
3,'asd3',923123123,
我建议您使用以下输入测试所有可能的解决方案:
$ cat file
INSERT INTO tbl VALUES (1, NULL, 923123123, 'foo NULL bar');
$ awk -F' *[(),]+ *' -v OFS=, '{for (i=2;i<NF;i++) printf "%s%s", ($i=="NULL"?"":$i), (i<(NF-1)?OFS:ORS)}' file
1,,923123123,'foo NULL bar'
确保字符串 NULL
和空白字符在作为文字字符串的一部分出现时不会被删除。
awk -F'[()]' -v OFS=, '{gsub(/NULL|;/,"")}{gsub(/, /,",")}{print $(NF -1)}' file
1,'asd',923123123,'zx'
1,,923123123,'zxz'
3,'asd3',923123123,
我正在寻找 awk
命令或类似工具,以将格式良好的标准 SQL 插入脚本转换为 csv 文件。
按照标准,我的意思是任何地方都没有数据库供应商特定的东西。
我所说的格式良好是指 sql 脚本的每一行都有一个完整的列集要插入,即使有 NULL。插入字段的顺序也是相同的。
示例输入 SQL 脚本:
INSERT INTO tbl VALUES (1, 'asd', 923123123, 'zx');
INSERT INTO tbl VALUES (1, NULL, 923123123, 'zxz');
INSERT INTO tbl VALUES (3, 'asd3', 923123123, NULL);
可选:
INSERT INTO tbl (colA, colB, colC, colD) VALUES (1, 'asd', 923123123, 'zx');
预期输出应该是一个 csv 文件:
1,'asd',923123123,'zx'
1,,923123123,'zxz'
3,'asd3',923123123,
寻找性能高效的解决方案。
用 GNU grep 和 sed 试试这个:
grep -oP '\(\K[^)]*(?=\);)' file | sed 's/NULL//g;s/ //g'
所有四行的输出:
1,'asd',923123123,'zx' 1,,923123123,'zxz' 3,'asd3',923123123, 1,'asd',923123123,'zx'
或仅使用 GNU sed:
sed 's/.*(\([^)]*\));//;s/NULL//g;s/ //g' file
所有四行的输出:
1,'asd',923123123,'zx' 1,,923123123,'zxz' 3,'asd3',923123123, 1,'asd',923123123,'zx'
$ awk -F' *[(),]+ *' -v OFS=, '{for (i=2;i<NF;i++) printf "%s%s", ($i=="NULL"?"":$i), (i<(NF-1)?OFS:ORS)}' file
1,'asd',923123123,'zx'
1,,923123123,'zxz'
3,'asd3',923123123,
我建议您使用以下输入测试所有可能的解决方案:
$ cat file
INSERT INTO tbl VALUES (1, NULL, 923123123, 'foo NULL bar');
$ awk -F' *[(),]+ *' -v OFS=, '{for (i=2;i<NF;i++) printf "%s%s", ($i=="NULL"?"":$i), (i<(NF-1)?OFS:ORS)}' file
1,,923123123,'foo NULL bar'
确保字符串 NULL
和空白字符在作为文字字符串的一部分出现时不会被删除。
awk -F'[()]' -v OFS=, '{gsub(/NULL|;/,"")}{gsub(/, /,",")}{print $(NF -1)}' file
1,'asd',923123123,'zx'
1,,923123123,'zxz'
3,'asd3',923123123,