-1

ファイルを解析しています。最初に行うことは、最初の 3 つのフィールドを連結し、それらを各レコードの先頭に追加することです。次に、コロン、一重引用符、二重引用符、またはバックスラッシュのデータをスクラブしたいと思います。以下は私がやっている方法ですが、より効率的な $line 変数を使用してそれを行う方法はありますか?

# Read the lines one by one.
while($line = <$FH>) {

# split the fields, concatenate the first three fields,
# and add it to the beginning of each line in the file
    chomp($line);
    my @fields = split(/,/, $line);
    unshift @fields, join '_', @fields[0..2];

# Scrub data of characters that cause scripting problems down the line.
        $_ =~ s/:/ /g for @fields[0..39];
        $_ =~ s/\'/ /g for @fields[0..39];
        $_ =~ s/"/ /g for @fields[0..39];
        $_ =~ s/\\/ /g for @fields[0..39];
4

2 に答える 2

1

以前に非常によく似た質問を見たことがあると確信していますが、単純な検索では見つかりません。際立っているのは、元の値の関数である残りのすべての前に新しいフィールドを追加することです

あなたはそれをPerl用語で最もよく説明しました

unshift @fields, join '_', @fields[0..2];

したがって、残る唯一のステップは不正な文字 (一重引用符と二重引用符、コロン、バックスラッシュ) を削除することです

あなたのコードはうまくいくようです。私が行う唯一の変更は

  • デフォルト変数を$_適切に使用してください。これは、初心者が Perl について最も嫌うものであり、一度理解すると最も好きになるものだと思います

  • tr///dの代わりに使用しs///ます。少し速度が上がるかもしれませんが、何よりも、削除する文字を言いたいだけで、もっと簡単なものが必要な場合は、正規表現構文から解放されます

これはあなたが必要とすることをするべきだと思います

use strict;
use warnings 'all';

while ( <DATA> ) {

    chomp;
    my @fields = split /,/;

    unshift @fields, join '_', @fields[0..2];

    tr/:"'\\//d for @fields; # Delete colons, quotes, and backslash

    print join(',', @fields), "\n";
}

__DATA__
a:a,b"bb",c'ccc',ddd,e,f,g,h

出力

aa_bbb_cccc,aa,bbb,cccc,ddd,e,f,g,h
于 2016-04-28T16:50:48.497 に答える