【问题标题】:Populate empty CSV fields using sed? [closed]使用 sed 填充空的 CSV 字段? [关闭]
【发布时间】:2013-02-20 23:49:32
【问题描述】:

我需要在 文件的所有空单元格(没有任何值)中输入一些值(例如 1)。如何使用 完成?

如果 无法做到这一点,那么 可以做到吗?

【问题讨论】:

标签: csv sed sed perl perl csv sed


【解决方案1】:

可以使用awk 完成。你可以试试:

awk '{for(i=1; i<=NF; i++) if($i=="") $i=1}1' FS=, OFS=, file

-----

阅读 Larsen 的评论后,我意识到他是对的,因为 OP 并没有真正发布可以显示引用字段是否会出现的示例。我试图找到一种更简单的更通用的方法来尝试采用这种方法考虑到..

awk '
  {
    for(i=1; i<=NF; i++) {                              # For every field
      if($i=="")                                        # it is empty 
        $i=1                                            # then make it 1 requirement OP
      else {
        f=$i                                            # set `f` to the current field
        while( gsub(/"/,"&",f )%2 && i<NF ) f=f $(++i)  # while the total number of double quotes is odd, keep adding the next field to the current field and ignore it..
      }
    }
  }
  1                                                     # print the record
' FS=, OFS=, file                                       # set the I/O field separators to `,`

或者在一行中:

awk '{for(i=1; i<=NF; i++) if($i=="") $i=1; else { f=$i; while( gsub(/"/,"&",f)%2 && i<NF) f=f $(++i)}}1' FS=, OFS=, file

使用此输入进行测试:

,1997,Ford,,"Super, ""luxurious"" ,,,truck",,
0,1997,Ford,,"Super, ""luxurious"" ,,,truck",,,,

制作:

1,1997,Ford,1,"Super, ""luxurious"" ,,,truck",1,1
0,1997,Ford,1,"Super, ""luxurious"" ,,,truck",1,1,1,1

【讨论】:

  • +1:对于awk 方法,即使没有要求,它也可能是最好的方法。
  • 我用 awk 版本修改了我的帖子,该版本试图将引号考虑在内..
【解决方案2】:

我认为使用 或 Perl 单行列处理 CSV 文件至少可以说是乐观的。如果格式发生变化,如果其中一个字段包含分隔符怎么办?我推荐使用Text::CSV_XS,它非常简单高效。通常,诸如您所要求的简单任务只需要几行代码。给定一个正确配置的 Text::CSV_XS 实例 ($csv),它只需要:

while ( my $row = $csv->getline( $in ) ) {
  my @new_row = map { defined $_ ? $_ : 1 } @$row;
  $csv->print( \*STDOUT, \@new_row );
}

如果您仍想直接使用命令行,可以检查csv (App::CSV),IMO 的方法比上述替代方法更明智。

【讨论】:

  • +1 指出输入文件规范不清楚。我用awk 版本修改了我的帖子,试图将引号考虑在内。
【解决方案3】:

怎么样:

$ cat file
v,,v,,,v,v,,,,
,,v,,v,v,,,v,,,v
,,,,,,,,,,,,,,

$ sed -e 's/^,/v,/' -e':a;s/,,/,v,/;ta' -e 's/,$/,v/' file
v,v,v,v,v,v,v,v,v,v,v
v,v,v,v,v,v,v,v,v,v,v,v
v,v,v,v,v,v,v,v,v,v,v,v,v,v,v

如果您对更改感到满意,请使用-i 选项将更改存储回文件。

$ sed -i -e 's/^,/v,/' -e':a;s/,,/,v,/;ta' -e 's/,$/,v/' file

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-20
  • 2016-06-17
  • 2018-06-13
  • 2013-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多