2

現在、対処しやすいと思われる問題に直面していますが、これまでのところ解決できていません。「パイプで区切られた値」ファイルがあり、すべての行のすべての値の先頭と末尾のスペースをすべて削除したいと考えています。このファイルには複数の行が含まれる場合があります。

例:

1|     | Field2     | Field3
2| 123 | Field2     |
3|     |            | Field3

スペースを削除した後に欲しいもの:

1||Field2|Field3
2|123|Field2|
3|||Field3

これまでのところ、最後のフィールド (この場合は Field3) が NULL でない限り機能します。これは、上記の例の 2 行目に対応します。最後のフィールドが NULL の場合、その行が次の行と連結され、予想よりも大きな行が作成されます。

これまでの私のコードは次のとおりです。

$res =~ s/\s*\|\s*/\|/g;

前述のように、これはすべての行の最後のフィールドが NULL でない限り機能します。最後のパイプを除くすべてのパイプに一致する正規表現を考え出そうとしましたが、これまでのところ成功していません。

すべてのスペースを削除して行の整合性を維持する方法はありますか?

前もって感謝します、

ジョアン

4

2 に答える 2

5

正規表現/\s/は、スペースとタブだけでなく、キャリッジ リターンと改行 (とりわけ) に一致するため、置換により、最終フィールドが null のレコードの末尾の改行が削除されます。

試す

$res =~ s/[ \t]*\|[ \t]*/|/g;

また

$res =~ s/[ ]*\|[ ]*/|/g;

タブ文字を削除することに興味がない場合。

(置換文字列のパイプはエスケープする必要はありません。)

于 2012-07-03T14:31:57.687 に答える
0
my $file_data = <<DATA;
1|     | Field2     | Field3
2| 123 | Field2     |
3|     |            | Field3
DATA

foreach my $line (split /[\n\r]/, $file_data) {
    my @fields;

    foreach my $field (split /\|/, $line) {
            $field =~ s/^\s*(.*?)\s*$/$1/;
            push @fields, $field;
    }

    print join '|', @fields;
    print "\n";
}
于 2012-07-03T14:36:49.437 に答える