You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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;
' 你的输入文件名 > 处理后的输出文件名

逻辑说明:

  1. 用$in_quote变量跟踪当前是否处于未闭合的引号字段内
  2. 统计当前行的引号数量,取模2判断是否翻转引号状态(奇数引号会切换状态)
  3. 如果处于引号内(说明这行是上一行字段的延续),则去掉换行符后打印;否则直接保留原行的换行

方案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"
    }
' 你的输入文件名 > 处理后的输出文件名

逻辑说明:

  1. 用in_quote标记引号状态,初始为0(不在引号内)
  2. 统计当前行引号数量,更新状态:若当前在引号内,且行内引号数为奇数,则退出引号;反之进入
  3. 处于引号内时用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 12:18:27