0

ファイルを解析したいとします

$ cat toParse.txt
1 2 3 4 5
1 "2 3" 4 5
1 2 "3" 4 5

最初の2行は解析が簡単です: Text::CSVそれを処理できます。たとえば、私は試しました:

厳密に使用します。
Text::CSVを使用します。
その間() {
    チョップ$_;
    my $ csv = Text :: CSV-> new({sep_char =>''、quote_char =>'"'、binary => 1});
    $ csv-> parse($ _);
    私の@fields=$ csv-> fields();
    私の$badArg= $ csv-> error_input();
    print "fields [1] = $ fields [1] \ n";
    print "不正な引数:$ badArg \ n \ n";
}

ただし、トークン化されたフィールドに引用文字が含まれていると、CSVは非常に混乱します。

上記のプログラムは次のように出力します。

fields [1] = 2
悪い議論:

fields [1] = 2 3
悪い議論:

fields [1] =
悪い議論:1 2 "3" 4 5

誰か提案はありますか?ファイナルfields[1]に...を入力し2" 3 "たいのですが、言い換えると、引用符で囲まれた文字列に含まれていない空白の行を分割したいと思います。

4

2 に答える 2

1

必要なのはCSVではないため、独自の解析をコーディングする必要があります。

これは、特定のケースで機能するはずです。

use strict;

while (<DATA>) { 
    chomp $_;
    my @fields = /([^\s"]+|(?:[^\s"]*"[^"]*"[^\s"]*)+)(?:\s|$)/g;
    print "$_\n" for @fields;
    print "\n";
}

__DATA__

1 2 3 4 5
1 "2 3" 4 5
1 2" 3 " 4 5 
1 2" 3 "4 5 
1 2" 3 "4" 5" 6
1 2" 3 "4"" 5"" 6

...そしてその出力は次のとおりです。

1
2
3
4
5

1
"2 3"
4
5

1
2" 3 "
4
5

1
2" 3 "4
5

1
2" 3 "4" 5"
6

1
2" 3 "4""
5""
6

ここをクリックてテストしてください。

于 2012-05-10T22:02:20.253 に答える
0

quote_charを「」以外に変更すると、3行目は次のようになります。

1
2"
3
"
4
5

ただし、2行目は

1 
"2
3"
4
5

したがって、「」が引用符の区切り文字である行とそうでない行があるように見えます。

したがって、解析しているファイルは壊れており、賢くする必要があります。

于 2012-05-10T21:27:41.197 に答える