2017-12-05 18 views
1

私はCSVファイルのリストを持っています。それぞれの空の列の数を追加する必要があります。空の列の数は、最初のファイルは0の列を挿入したい、2番目のファイルは1列を挿入したい、3番目のファイルは2列を挿入するなど、列は常に2番目のものとして挿入する必要があります。 すべての入力ファイルは、以下の例のように2列CSVあるperlを使用してcsvファイルに空の列を挿入する方法

ファイル1

2016/03/07 23:42:40.618 GMT,54.5 
2016/03/07 23:43:40.618 GMT,54.0771 
2016/03/07 23:44:40.618 GMT,53.9472 
2016/03/07 23:45:40.618 GMT,54.2914 

等ファイル2

2016/03/07 23:42:40.618 GMT,49.013 
2016/03/07 23:43:40.618 GMT,48.688 
2016/03/07 23:44:40.618 GMT,47.7052 
2016/03/07 23:45:40.618 GMT,47.9057 

FILE3

2016/03/07 23:51:40.618 GMT,50.7858 
2016/03/07 23:52:40.618 GMT,52.5267 
2016/03/07 23:53:40.618 GMT,54.2865 
2016/03/07 23:54:40.618 GMT,53.2014 
2016/03/07 23:55:40.618 GMT,52.0538 

私はこのコードが書いてあるが、それは持つすべてのファイルに対して同じ出力を生成し出力が

file1の

2016/03/07 23:42:40.618 GMT,54.5 
2016/03/07 23:43:40.618 GMT,54.0771 
2016/03/07 23:44:40.618 GMT,53.9472 
2016/03/07 23:45:40.618 GMT,54.2914 

File2の

2016/03/07 23:42:40.618 GMT,,49.013 
2016/03/07 23:43:40.618 GMT,,48.6883 
2016/03/07 23:44:40.618 GMT,,47.7052 
2016/03/07 23:45:40.618 GMT,,47.9057 

FILE3

2016/03/07 23:51:40.618 GMT,,,50.7858 
2016/03/07 23:52:40.618 GMT,,,52.5267 
2016/03/07 23:53:40.618 GMT,,,54.2865 
2016/03/07 23:54:40.618 GMT,,,53.2014 
2016/03/07 23:55:40.618 GMT,,,52.0538 

になりたいですただ1つの空の列を追加しました、おそらく私は何か愚かな行方不明ですが、私は何を得ることができません

#!/usr/bin/perl 
#use strict; 
#use diagnostics; 
use CGI qw(:standard); 
use Cwd; 
use File::Find; 
use File::Basename; 
use Text::CSV; 
use Text::Trim qw(trim); 
use List::MoreUtils qw(uniq); 
use Text::CSV_XS; 
sub read_dir{ 
    my $ph=$_[0]; 
    my $match=$_[1]; 
    my @fl = (); 
    #print "<b> will open $ph"; 
    opendir DH, "$ph" or die "Cannot open Dir $ph: $!"; 
    #if ($match eq "") { 
    @fl = grep !/^\.\.?$\.*/, sort(readdir DH) ; 
    #} 
    #else { 
    # my @fl = grep {$_ =~ $match} sort(readdir DH) ; 
    #} 
    closedir DH; 
    if ($match ne "") { 
     foreach my $file (@fl){ 
      if ($file =~$match) { 
       push(@ffl,$file); 
      } 
     } 
     return @ffl; 
    } 
    else { 
     return @fl; 
    } 
} 
@column=(); 
$loc="/myfolder"; 
$offset=1; 
@sites=("dir1","dir2","dir3"); 
$s="subdir"; 
foreach $t (@sites) { 
    $m=0; #number of empty column to insert in the file 
    @list=read_dir("$loc/Statistics/$t/$s"); #directory that contain the csv file to manipulate 
    foreach $l (@list) { 
     #inser the empty column 
     open $in, "<","$loc/Statistics/$t/$s/$l" or die $!; 
     open $out, ">>", "$loc/Statistics/$t/$s/$l.tmp" or die $!; 
     foreach $r (0..$m) { 
      print "<br> r is $r"; 
      open $out, ">>", "$loc/Statistics/$t/$s/$l.tmp" or die $!; 
      while ($row = $ccsv->getline($in)) { 
       splice @$row, $offset, 0, shift @column; 
       $ccsv->print($out, $row); 
      } 
      close $out; 
     } 
     close $in; 
     $m=$m+1; 
    } 
} 
+1

あなたのコードが不完全であってもコンパイルされません$カンマに1を加算します。あなたの質問を編集し、実際のコードを投稿してください。また、厳格と警告をオンにします。変数を宣言する必要があります。これを済ませれば、多くの問題が明らかになり、解決しやすくなります。 – simbabque

+0

不足している部分を追加しました – Cris

答えて

3
perl -i~ -pe ' 
    s/,/"," x (1 + $commas)/e; 
    $commas++ if eof; 
' -- file1 file2 file3 
  • -p、行毎にファイルを読み込むコードを実行した後、それは
  • -i~file1~など
  • としてバックアップを保存し、「場所に」入力ファイルを変更し、それを印刷します
  • s/,/"," x $commas/eは、置換部分の評価コードにカンマを置き換えます。つまり、カンマは、最初のファイルに対して1回、2回目に2回繰り返されます。
  • 0真戻り、入力ファイルが終了するたびに、eof
  • $commas++を参照してください
+0

CSVファイルを手動で解析しないように教えていないのですか? ;-) – PerlDuck

+2

@ PerlDuck:誰が "私"ですか? :-)もっと複雑なファイルの場合は、[Text :: CSV_XS](http://p3rl.org/Text::CSV_XS)にアクセスしますが、サンプル入力が正確であれば、その必要はありません。 – choroba

+0

この特定の場合、私は同意することができます。しかし、通常、ここで誰かが「分割」などでCSVファイルをどのように処理するかを尋ねると、群衆は弾道になり、そうしないように指示します。太字と斜体で表示されます。 :-)しかし、私はあなたのコードがかなりクールな1ライナーであることを認めなければなりません。 – PerlDuck

関連する問題