IICS加载含换行符的管道分隔文件问题及脚本优化需求
处理带换行和英寸符号的管道分隔CSV文件
我们有一个以双引号作为字段限定符的管道分隔CSV文件,部分文本字段包含换行符和代表英寸的"符号。用IICS加载数据时,带换行符的文本列会被识别为多行,需要将文本列内的换行符替换为空格,同时批量转义英寸符号。之前尝试的gawk命令未解决问题:
gawk -v RS='"' 'NR % 2 == 0 {gsub(/[/\n]/, "") } { printf("%s%s", $0, RT) }' output2.csv > output3.csv
场景1:文本含英寸符号的处理
原始数据
"col1"|"col2"|"col3"|"col4" "2002-04-09 00:00:00"|"True"|"2023 - (1) FA L-shape desk (left-handed) 2023 - (1) 29" credenza for BOA, (1) custom 66" BOA A2 workstation with HA bridge (left-handed) 2023 - (1) 42" round table 2023 - (5) Rein guest chairs in hashtag fabric"|"5"
原命令执行后,换行符被移除但英寸符号"变为"",且最后一个字段的闭合引号丢失,不符合CSV规范。
场景2:文本含特殊字符的换行处理
原始数据
"col1"|"col2"|"col3"|"col4" "2020-06-30 00:00:00"|"False"|"STANDARD: 2008 1-Endura FA Workstation 2008 1-Endura BOA Workstation with Lateral File Cabinet 2021 2-Zonal Task Chairs "|"4"
原命令执行后无变化,字段内换行符未被替换,仍导致多行识别问题。
修正后的解决方案
使用以下gawk命令,精准识别双引号包裹的字段内部内容,同时完成换行符替换和英寸符号转义:
gawk -v RS='"' ' NR % 2 == 0 { gsub(/\n/, " "); # 将字段内换行符替换为空格 gsub(/"/, "\"\""); # 转义字段内的双引号(符合CSV规范) } { printf "%s%s", $0, RT } ' input.csv > output.csv
场景1处理效果
执行后输出:
"col1"|"col2"|"col3"|"col4" "2002-04-09 00:00:00"|"True"|"2023 - (1) FA L-shape desk (left-handed) 2023 - (1) 29"" credenza for BOA, (1) custom 66"" BOA A2 workstation with HA bridge (left-handed) 2023 - (1) 42"" round table 2023 - (5) Rein guest chairs in hashtag fabric"|"5"
- 字段内换行符全部替换为空格,保持单行结构
- 英寸符号
"转义为"",不破坏字段边界
场景2处理效果
执行后输出:
"col1"|"col2"|"col3"|"col4" "2020-06-30 00:00:00"|"False"|"STANDARD: 2008 1-Endura FA Workstation 2008 1-Endura BOA Workstation with Lateral File Cabinet 2021 2-Zonal Task Chairs "|"4"
- 字段内换行符替换为空格,合并为单行
- 冒号、连字符等特殊字符不影响处理逻辑
内容的提问来源于stack exchange,提问作者pavan kumar
相关产品推荐
相关产品推荐

