我有一个 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