1

filenameaとcolumn nameCSV ファイル内の2 つの引数を取るサブルーチンを作成しようとしています。サブルーチンは 2 番目の引数 (列名) を検索し、その列 (または複数の列) を CSV ファイルから削除してから、引数が削除された CSV ファイルを返します。

このサブの前半 (ファイルを開き、ヘッダーと値を取得する) を完了したような気がしますが、CSV ファイルでユーザーが入力した文字列を検索して削除する方法が見つからないようです。コラム全体。何か案は?これが私がこれまでに持っているものです。

sub remove_columns {
   my @Para = @_;
   my $args = @Para;
   die "Insufficent arguments\n" if ($nargs < 2);

   open file, $file
   $header = <file>;
   chomp $header;

   my @hdr = split ',',$header;

   while (my $line = <file>){
    chomp $line;
    my @vals = split ',',$line;

    #hash that will allow me to access column name and values quickly
    my %h;

    for (my $i=0; $i<=$#hdr;$i++){
      $h{$hdr[$i]}=$i;
    }
     ....
}

ここで検索と削除が行われます。私はこれをどうするか考えていました。変更する CSV ファイルは巨大になるため、速度が重要な要素ですが、これを行う良い方法が思いつかないようです。私はPerlを初めて使用するので、少し苦労しています。

4

3 に答える 3

1

ここに、うまくいけばうまくいくいくつかのヒントがあります。

配列の位置にある配列の要素を削除するには、$index次を使用します。

splice @array,$index,1 ;

速度が問題になるため、最初に列番号の配列を作成してから、配列の要素をループすることをお勧めします。

for my $index (@indices) {
  splice @array,$index,1 ;
} 

(この方法はタイプ loopよりも慣用的な Perl ですfor (my $i=0; $i<=$#hdr;$i++))

もう 1 つ考慮すべき点 - CSV 形式は驚くほど複雑です。あなたのデータには、次のようなデータが含まれている可能性があり,ます" "

1,"column with a , in it" 

Text::CSVのようなものを使用することを検討します

于 2013-08-17T18:34:13.250 に答える
1

配列からいくつかの列を削除するエレガントな方法があります。array に削除する列@colsがあり、ヘッダーが含まれている場合@headers、保持するインデックスの配列を作成できます。

my %to_delete;
@to_delete{@cols} = ();
my @idxs = grep !exists $to_delete{$headers[$_]}, 0 .. $#headers;

その後、新しいヘッダーを簡単に作成できます

@headers[@idxs]

また、読み取り列からの新しい行

@columns[@idxs]

たとえば、配列の再配置にも同じアプローチを使用できます。この種のタスクを実行する方法は、非常に高速でかなり慣用的な Perl の方法です。

于 2013-08-17T20:33:00.003 に答える