【问题标题】:Adding a new column to a CSV file向 CSV 文件添加新列
【发布时间】:2017-06-22 11:46:04
【问题描述】:

我有一个如下所示的 CSV 文件:

"12345","TestTest","1.2","TestTest
"

我想在 CSV 文件的开头或结尾添加一个日期,例如 YYYY-MM-DD HH:MM:SS。正如您在上面的示例中所见,双引号 (") 将列上的值括起来,逗号 (,) 划定每一列。问题是行尾的双引号总是在新行上。这意味着当我尝试使用 sed 基于单个双引号进行搜索/替换时,我的替换不仅在行首,而且在行尾。

我的下一个理论是,是否可以使用某些工具(sed、awk 等)仅在 CSV 行的开头是双引号和数字时添加日期,即:“12345”,所以新的行看起来像:

"YYYY-MM-DD HH:MM:SS","12345","TestTest","1.2","TestTest
"

注意:您建议的此命令应将此更改应用于 CSV 文件中的每一行。这也需要通过linux命令行运行。

谢谢,

【问题讨论】:

    标签: csv awk sed


    【解决方案1】:

    使用 sed:

    sed 'N;s/^/"YYYY-MM-DD HH:MM:SS",/' file
    

    如果你想确保下一行有一个"

    sed 'N;/\n"$/s/^/"YYYY-MM-DD HH:MM:SS",/' file
    

    编辑:

    在第 5 个字段之后插入字符串:

    sed 'N;s/","/","YYYY-MM-DD HH:MM:SS","/5' file
    

    【讨论】:

    • 是否可以选择其中一个列字段?我的 CSV 中有 13 个字段。您可以让 sed 计算 (,) 分隔符的数量并将其插入到第 5 列而不是开头或结尾处吗?
    • 我编辑了我的答案,但您应该考虑使用 awk 处理 csv 文件。
    • 谢谢。使用 sed 将我的数据插入几列深是我需要的魔法。
    【解决方案2】:

    我建议使用 csv 解析器来避免可能包含分隔符或换行符的字段出现问题。您可以在 perl 命令行中使用 Text::CSV 模块。在第 4 列插入字符串的示例:

    perl -MText::CSV -E'$csv = Text::CSV->new({binary=>1}); 
    while ($row = $csv->getline(STDIN)){
        splice @$row, 3, 0, "YYYY-MM-DD";
        say "\"", join("\",\"",@$row), "\""
    }' file.csv
    

    【讨论】:

      【解决方案3】:

      awk 来救援!

      $ awk -F, 'NF>1{$0 = "\"YYYY-MM-DD\"" FS $0}1' file
      

      NF>1 测试检查是否有多个字段在行中,如果有,则在其前面加上新字段,最后的1{print} 的简写。

      【讨论】:

      • 是否可以选择其中一个列字段?我的 CSV 中有 13 个字段。您可以让 awk 计算 (,) 分隔符的数量并将其插入到第 5 列而不是开头或结尾处吗?
      • 在语句中使用 $5 而不是 $0。
      • 如果修改字段,还需要设置 OFS。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-09
      • 1970-01-01
      • 2021-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      相关资源
      最近更新 更多