【问题标题】:Change delimiter in not regular CSV更改非常规 CSV 中的分隔符
【发布时间】:2020-08-31 13:51:53
【问题描述】:

我有以下 CSV 文件:

ID,COUNTRY,DESCRIPTION,PRICE
1,USA,Short description,11
2,UK,"Description with comma , inside",2.3

因此,如果字段包含逗号,则将其放在双引号中。

如何将分隔符从逗号替换为制表符但忽略引号中的逗号?所以我会有:

ID    COUNTRY    DESCRIPTION    PRICE
1    USA    Short description    11
2    UK    "Description with comma , inside"    2.3

或不带双引号:

ID    COUNTRY    DESCRIPTION    PRICE
1    USA    Short description    11
2    UK    Description with comma , inside    2.3

在注意到某些字段包含逗号之前,我使用了这段代码:

$VAR='\t'
sed -i $"s/,/$VAR/" $FILE_NAME

【问题讨论】:

  • 开 所以强烈鼓励在问题中增加努力。因此,请在您的问题中以代码的形式添加您的努力,然后让我们知道。
  • 搞错了,已编辑
  • 查看csvkit工具。
  • 您不需要将数据中的制表符转换为空白或其他内容,这样您最终不会得到比开始时更多的字段吗?另请参阅whats-the-most-robust-way-to-efficiently-parse-csv-using-awk

标签: shell unix awk sed


【解决方案1】:

使用 GNU awk,您能否尝试使用所示示例编写以下内容(如果您想在 Input_file 本身中进行编辑,请在以下解决方案中添加 > temp && mv temp Input_file)。

awk -v FPAT='[^,]*|"[^"]+"' -v OFS="\t" '{$1=$1}1' Input_file

或从 line 字段的开头和结尾删除 " 然后运行以下。

awk -v FPAT='[^,]*|"[^"]+"' -v OFS="\t" '
{
  for(i=1;i<=NF;i++){
    gsub(/^"|"$/,"",$i)
  }
  $1=$1
}
1
' Input_file

【讨论】:

  • 感谢您的回答,FPAT 看起来正是我所需要的......不幸的是,它在我们的系统中不起作用,因为我们安装了较低的 awk (
  • @user1632454,肯定没问题,祝你学习愉快。
  • @user1632454 您应该更新您的 gawk 版本,因为您已经过时了大约 10 年,并且缺少一些错误修复和大量非常有用的新功能。
【解决方案2】:

这可能对你有用(GNU sed):

sed -E ':a;s/^([^"]*("[^",]*"[^"]*)*"[^"]*),/\1\n/;ta;y/,/\t/;y/\n/,/' file

将双引号内的所有逗号转换为换行符,将剩余的逗号转换为制表符(或其他),然后将换行符转换回逗号。

注意如果新的分隔符是换行符或双引号内有双引号,则此方法无效。

【讨论】:

    【解决方案3】:

    Ruby 有个不错的csv module:

    ruby -rcsv -e '
      out = CSV.new($stdout, col_sep: "\t")
      CSV.foreach(ARGV.shift) {|row| out << row}
    ' file.csv
    

    将自动用标签引用输出字段:

    $ cat -A file.csv
    ID,COUNTRY,DESCRIPTION,PRICE$
    1,USA,Short description,11$
    2,UK,"Description with comma , inside",2.3$
    3,CA,"Description with^Itab inside",2.3$
    
    $ ruby -rcsv -e '
      out = CSV.new($stdout, col_sep: "\t")
      CSV.foreach(ARGV.shift) {|row| out << row}
    ' file.csv
    ID  COUNTRY DESCRIPTION PRICE
    1   USA Short description   11
    2   UK  Description with comma , inside 2.3
    3   CA  "Description with   tab inside" 2.3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-16
      • 2020-07-06
      • 2015-10-12
      • 1970-01-01
      • 2023-04-03
      相关资源
      最近更新 更多