解析具有多行值和回车符的 CSV

解析具有多行值和回车符的 CSV

我有一个 CSV 文件,我正在尝试使用以下sed单行代码删除双引号值。有关这方面的详细信息可以在我的原来的帖子来弄清楚

sed -i.bak 's/^"//g;s/","/,/g;s/"$//g' $1 

尽管现在这在大多数情况下都有效,但我的导出之一存在问题,该导出有多行,并且显然是用回车符分解的。这是数据的证明样本

$ cat -v Quote.csv

"Id","Blob","Employee","Etc"^M
"0Q01N000001MxPbSAK","Job to happen late day/ evening", "Employee 1", "more stuff"^M
"0Q01N000001N4klSAC","Daytime work during normal businesses hours ^M
some details ^M
some more details ^M
conclusion","Employee 2", "more stuff"%

当我在完整文件上尝试执行此操作时,出现以下错误:

CSV error: record 2 (line: 4, byte: 101): found record with 2 fields, but the previous record has 4 fields

我相信这是因为列和行的对齐方式是扭曲的,即使它在 Excel 中“看起来”很好。

关于如何正确解析这个问题的任何想法,以便我可以解决这个问题。我需要删除双引号,以便当我将 CSV 导入 ArangoDB 时,可以正确键入值。

找到另一个论坛本质上是相同的问题,并且提出了一个解决方案。

sed 's/$/~/' Quote.csv |tr '\n' ' '   |sed 's/~ "KEY-/\n"KEY-/g'

我相信,如果我可以对其进行逆向工程以使其适合我的ID领域,那么也许它可以发挥作用。我还注意到我有<br>字符,我不确定它们是否tr也需要被删除(似乎这会因为出现预期的换行符而弄乱数据)

答案1

输出的真正问题是它在单元格内有 \r\n 两个记录结尾和回车符。

相反,正确的 CSV 是这样的

在此输入图像描述

如果您更正创建输出的过程,使其具有与上面类似的内容,并在示例 Miller 中使用http://johnkerl.org/miller/doc和 sed

tail -n +2 input.csv | \ mlr --implicit-csv-header --rs '\r\n' --icsvlite --ocsv put '$2=gsub($2,"\n"," ")' then label Id,Blob,Employee,Etc | \ sed 's/"//g'

你将在输出中得到

Id,Blob,Employee,Etc 0Q01N000001MxPbSAK,Job to happen late day/ evening,Employee 1,more stuff 0Q01N000001N4klSAC,Daytime work during ... details conclusion,Employee 2, more stuff

相关内容