如何将Snowflake上传文件中拆分的多行合并为单行?
解决Snowflake上传文件中拆分行的合并问题
你的核心问题是仅合并那些因带引号字段(如漏洞说明)跨多行导致的拆分行,而非盲目合并所有行。之前的Perl命令逻辑有误——它只判断行尾是否为引号,没有考虑行内引号的配对状态,因此无法准确识别哪些行属于拆分的字段行。
方案1:Perl脚本(精准跟踪引号状态)
这个脚本会逐行判断是否处于未闭合的引号内,仅合并属于字段内部的拆分行:
perl -ne ' BEGIN { $in_quote = 0; } $quote_count = ($line = $_) =~ tr/"//; $in_quote ^= ($quote_count % 2); print $in_quote ? chomp($line) ? $line : $line : $line; ' 你的输入文件名 > 处理后的输出文件名
逻辑说明:
- 用
$in_quote变量跟踪当前是否处于未闭合的引号字段内 - 统计当前行的引号数量,取模2判断是否翻转引号状态(奇数引号会切换状态)
- 如果处于引号内(说明这行是上一行字段的延续),则去掉换行符后打印;否则直接保留原行的换行
方案2:Awk脚本(适合熟悉Awk的场景)
同样基于引号配对状态判断,实现相同效果:
awk ' BEGIN { in_quote = 0 } { quote_num = gsub(/"/, "&") in_quote = (in_quote + quote_num % 2) % 2 printf "%s%s", $0, in_quote ? "" : "\n" } ' 你的输入文件名 > 处理后的输出文件名
逻辑说明:
- 用
in_quote标记引号状态,初始为0(不在引号内) - 统计当前行引号数量,更新状态:若当前在引号内,且行内引号数为奇数,则退出引号;反之进入
- 处于引号内时用
printf不输出换行,否则输出换行符完成行闭合
特殊情况处理(转义引号)
如果你的文件中存在双引号转义(如CSV规范中用""表示单个引号),上述脚本无需调整——因为""会被统计为2个引号,取模2后不影响状态判断。
如果是反斜杠转义引号(如"He said \"Hi\""),需要修改Perl脚本的引号统计逻辑:
perl -ne ' BEGIN { $in_quote = 0; } $line = $_; # 减去被反斜杠转义的引号数量 $quote_count = ($line =~ tr/"//) - ($line =~ tr/\\"//); $in_quote ^= ($quote_count % 2); print $in_quote ? chomp($line) ? $line : $line : $line; ' 你的输入文件名 > 处理后的输出文件名
内容的提问来源于stack exchange,提问作者Stas Becker
相关产品推荐
相关产品推荐

