unix 使用sed将带双引号的CSV文件转换为管道分隔格式

unhi4e5o  于 2023-11-18  发布在  Unix
关注(0)|答案(3)|浏览(195)

我正在尝试将CSV文件转换为管道分隔的文本文件。
假设我有一个名为sample.csv的文件:
第一个月
我想把它转换成这样的输出:
aaa"|bbb"ccc|ddd,eee|fff|ggg,hhh,iii|jjj kkk|lll" mmm|"nnn"ooo|ppp"qqq"|rrr" sss|ttt,"uuu|Z
现在,在大量的搜索之后,我已经使用这个sed命令:
sed -r 's/""/\v/g;s/("([^"]+)")?,/\2\|/g;s/"([^"]+)"$/\1/;s/\v/"/g'
然而,我收到的输出是:
aaa"|bbb"ccc|ddd,eee|fff|ggg,hhh,iii|jjj kkk|lll" mmm|"nnn"ooo|pppqqq|rrr" sss|ttt,"uuu|Z
第9列的期望值应该是ppp“qqq”,但结果删除了双引号,我得到的是pppqqq
我已经玩了一段时间了,但无济于事。任何有关这方面的帮助将不胜感激。

h7wcgrx3

h7wcgrx31#

sample.csv的问题在于它混合了非引号字段(包含引号)和完全引号字段(应该这样处理)。

你不能同时拥有这两个。要么所有字段都被(视为)不加引号并保留引号,要么所有包含引号(或分隔符)的字段都被完全引号,其中的引号用另一个引号转义。
因此,sample.csv应该变为:

"aaa""","bbb""ccc","ddd,eee",fff,"ggg,hhh,iii","jjj kkk","lll"" mmm","""nnn""ooo","ppp""qqq""","rrr"" sss","ttt,""uuu",Z

字符串
给给予你想要的结果(使用csv解析器):

aaa"|bbb"ccc|ddd,eee|fff|ggg,hhh,iii|jjj kkk|lll" mmm|"nnn"ooo|ppp"qqq"|rrr" sss|ttt,"uuu|Z

brqmpdu1

brqmpdu12#

正如评论中所建议的,sed或任何其他Unix工具都不推荐用于这种复杂的CSV字符串。在PHP中使用专用的CSV解析器会更好:

$s = 'aaa",bbb"ccc,"ddd,eee",fff,"ggg,hhh,iii","jjj kkk","lll"" mmm","nnn"ooo,ppp"qqq",rrr" sss,"ttt,""uuu",Z';
echo implode('|', str_getcsv($s));

个字符

jdgnovmf

jdgnovmf3#

有同样的问题。我发现正确的结果与https://www.papaparse.com/demo这里是一个开源的github上。所以也许你可以检查它是如何工作的。与源[ ",“bbb”“ccc”,“ddd,”,fff,“ggg,hhh,iii”,“jjj kkk”,“lll””mmm”,“nnn”“ooo”,“ppp”“qqq“,“rrr”sss”,“ttt",“uuu”,Z ]结果出现在浏览器控制台:[1]:https://i.stack.imgur.com/OB5OM.png

相关问题