0

ファイルのすべての空のセル(値なし)に値( )を入力する必要があります。を使用してどのように行うことができますか?1

で不可能な場合は、 で実行できますか?

4

3 に答える 3

6

、または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が前述の代替手段よりも賢明なアプローチを採用しています。

于 2013-03-06T10:33:45.580 に答える
3

それはで行うことができますawk。あなたは試すことができます:

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

-----

ラーセンのコメントを読んで、引用されたフィールドが発生するかどうかを示すサンプルを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 `,`

または1行で:

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
于 2013-03-06T09:44:27.427 に答える
2

どうですか:

$ 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
于 2013-03-06T09:20:58.997 に答える