1

当标题字段中有标点符号时,我正在努力将数据文件转换为 csv。

我有一个获取文件并处理它的 bash 脚本,它几乎可以工作。让我明白的是,当自由文本标题字段中有逗号时,它会创建额外的字段。

我尝试了一些 sed 示例来替换模式,但我没有让它们中的任何一个起作用。我想要做的是在两种模式之间工作,并将逗号替换为空或分号。

取这个字符串:

name:A100040,title:Oatmeal is better with raisins, dates, and sugar,current_balance:50000,

替换为:

name:A100040,title:Oatmeal is better with raisins dates and sugar,current_balance:50000,

我可能应该使用“title:”和“,current_”来表示我想要进行更改的块的开始和结束以避免这样的情况:

name:A100040,title:Re-title current periodicals, recent books,current_balance:50000,

到目前为止,我还没有得到匹配的替换。在这种情况下,我正在使用 !! 使变化明显:

teststring="name:A100040,title:Oatmeal is better with raisins, dates, and sugar,current_balance:50000,"

echo $teststring |sed '/title:/,/current_/s/,/!!/g'
name:A100040!!title:Oatmeal is better with raisins!! dates!! and sugar!!current_balance:50000!!

任何帮助表示赞赏。

4

2 回答 2

0

This is one way which could undoubtedly be refined:

perl -ple 'm/(.*?)(title:.*?)(current_balance:.*)/; $save = $part = $2; $part =~ s/,/!!/g;  s/$save/$part/'
于 2012-06-18T13:33:17.533 回答
0

首先,使用sedawk解析 CSV 几乎总是错误的做法,因为它们不允许引用字段分隔符。也就是说,似乎更好的方法是引用字段,以便您的输出为:

name:"A100040",title:"Oatmeal ... , dates, and sugar",current_balance:50000

使用sed你可以试试:(这个很脆弱)

sed 's/:\([^:]*\),\([^,:]*\)/:"\1",\2/g'

如果您坚持尝试使用“标准”工具解析 csv 并且您认为perl是标准的,您可以尝试:

perl -pe '1 while s/,([^,:]*),/ $1,/g'
于 2012-06-18T13:36:38.343 回答