【问题标题】:How to add double quote in csv file where field contains space?如何在字段包含空格的csv文件中添加双引号?
【发布时间】:2020-06-29 19:58:00
【问题描述】:

遗留代码的一个功能不起作用,我必须通过重新开发一个快速而肮脏的功能来解决问题。

我们正在生成 csv 文件,而我在遗留代码中有类似的东西:

foo; bar;"foo bar";foobar
"bla ble"; bli;blo;"blu bly"

我的 csv 中包含空格的每个字段都必须用双引号 "

目前,使用我快速而肮脏的脚本,我的 csv 文件只有

foo; bar;foo bar;foobar
bla ble; bli;blo;blu bly

这不好,因为客户会用我快速而肮脏的脚本进行重大更改:D

我正在使用 shell /bin/bash 开发一个脚本,我搜索了 arround sed 或 awk 但找不到可以帮助我的东西。

你愿意吗? :) 谢谢!

【问题讨论】:

  • 嗨!你尝试了什么?我不清楚你想要什么。
  • 带有前导空格的字段呢?为什么没有引用?
  • 适用于多种语言的 CSV 解析器和生成器。壳牌不是其中之一。
  • 严格来说,只有当字段值包含引号或分号或换行符时才需要引用。
  • @Adrien Bourgouin Sasa,请添加一些扩展输出行

标签: bash shell csv awk sed


【解决方案1】:

要引用包含空格的字段(例如foo;foo bar -> foo;"foo bar"),您可以使用sed

sed 's/ *\(\w\+ \)\+\w\+/"&"/g' input.csv > output.csv

模式*\(\w\+ \+\)\+\w\+ 匹配零个或多个空格,后跟一个包含一个单词和一个或多个空格\(\w\+ \+\) 的组,然后匹配一个或多个组\+,后跟一个单词\w\+。替换 "&" 引用匹配的模式。

【讨论】:

  • 谢谢,它可以满足我的要求,但我不想分享真正的 csv 文件示例,我没有告诉你我有像“2020 年 3 月 17 日 09:03:16”这样的字段”。在这种情况下,您的解决方案不起作用。但它完全符合我的错误要求,谢谢!
【解决方案2】:

这是一个简单的 awk:

$ awk 'BEGIN{FS=OFS=";"}{for(i=1;i<=NF;++i) if ($i ~ / /) $i = "\042" $i "\042"}1' file.csv

【讨论】:

  • 工作就像一个魅力,每个“句子”之间;是双引号。谢谢!
【解决方案3】:

使用 Miller (https://github.com/johnkerl/miller) 并运行

mlr --icsvlite --ocsv --quote-all --fs ";" cat input

你会有

"foo";"bar";"foo bar";"foobar"
"bla ble";"bli";"blo";"blu bly"

我认为你对所有的双引号都没有问题

【讨论】:

    【解决方案4】:
    echo "foo; bar;foo bar;foobar" | sed s'@;@+@'g | tr '+' '\n' | \
    sed s'@^@\"@'g | sed s'@$@\";@'g | tr -d '\n'
    

    此代码所做的第一件事是将冒号分隔符替换为占位符,然后可以将其替换为换行符。

    从那里开始,很简单。我首先用双引号替换每个新行的开头,然后用右双引号和冒号替换结尾。

    之后,我再次使用 tr 删除换行符,这会将所有以冒号分隔的字段放回同一行。

    【讨论】:

    • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
    猜你喜欢
    • 1970-01-01
    • 2013-06-14
    • 2020-05-21
    • 2022-10-14
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    相关资源
    最近更新 更多