3

私はウェブサイトからスクレイピングしたファイルに取り組んでいます。ファイルは引用符で囲まれたフィールドを持つセミコロンcsvとして保存されます。最後のフィールドには改行が含まれています。ファイルを処理するスクリプトに取り組んでいます。私はperlにかなり慣れていないので、最初は通常のperlスクリプトで試していましたが、すぐにうまくいかないことがわかりました。私は調査を行い、代わりに Text::CSV モジュールを使用する必要があることがわかりました。モジュールの使用方法を説明しているこれらのサイトに出くわしました。

http://perlmaven.com/how-to-read-a-csv-file-using-perl

http://perlmeme.org/tutorials/parsing_csv.html

http://metacpan.org/pod/Text::CSV#Embedded-newlines

基本的に私が達成しようとしているのは、改行で途切れるのではなく、すべてのフィールドが適切に区切られるように、ファイルを正しく読み取ることです。次に、そのフィールドから改行を削除して、新しいファイルに書き込みます。

元のデータの例を次に示します。

 "2030";"NH Amersfoort";"Stationsstraat 75";"3811 MH AMERSFOORT";"033-4221200";"www.nh-hotels.nl";"52.154316";"5.380036";"<UL class=stars><LI>
 <LI>
 <LI>
 <LI></LI></UL>"
 "2031";"NH Amsterdam Centre";"Stadhouderskade 7";"1054 ES AMSTERDAM";"020-6851351";"www.nh-hotels.com";"52.363075";"4.879458";"<UL class=stars><LI>
 <LI>
 <LI>
 <LI></LI></UL>"
 "2032";"NH Atlanta Rotterdam Hotel";"Aert van Nesstraat 4";"3012 CA ROTTERDAM";"010-2067800";"www.nh-hotels.com";"51.921028";"4.478619";"<UL class=stars><LI>
 <LI>
 <LI>
 <LI></LI></UL>" 

そして、私が欲しいのはこれです:

 "2030";"NH Amersfoort";"Stationsstraat 75";"3811 MH AMERSFOORT";"033-4221200";"www.nh-hotels.nl";"52.154316";"5.380036";"<UL class=stars><LI><LI><LI><LI></LI></UL>"
 "2031";"NH Amsterdam Centre";"Stadhouderskade 7";"1054 ES AMSTERDAM";"020-6851351";"www.nh-hotels.com";"52.363075";"4.879458";"<UL class=stars><LI><LI><LI><LI></LI></UL>"
 "2032";"NH Atlanta Rotterdam Hotel";"Aert van Nesstraat 4";"3012 CA ROTTERDAM";"010-2067800";"www.nh-hotels.com";"51.921028";"4.478619";"<UL class=stars><LI><LI><LI><LI></LI></UL>" 

これはこれまでの私の完全なスクリプトです。10 種類のオプションと提案を試しましたが、すべてうまくいきません!

 use strict;
 use warnings;    
 use Text::CSV;

 my $inputfile  = shift || die "Give input and output names!\n";
 my $outputfile = shift || die "Give output name!\n";

 open my $infile,  '<', $inputfile   or die "Sourcefile in use / not found :$!\n";
 open my $outfile, '>', $outputfile  or die "Outputfile in use :$!\n";

    my $csv = Text::CSV->new ({
binary => 1,
sep_char => ';'
});

while (my $elements = $csv->getline( $infile )) {
        my $stars = $elements->[8];
        #$ster =~ s/[\r\n]//g
        print "$stars\n\n";
        }

 close $infile;
 close $outfile;

これにより、改行が含まれるフィールドが正しく出力されますが、コースから削除されていません。それ、どうやったら出来るの?正規表現を使用して改行を置き換えても機能しません。次の質問は、そのフィールドをクリーンアップする方法を見つけたときです.. 新しいファイルを印刷するにはどうすればよいですか?

4

1 に答える 1

2

あなたはすでにあなたの答えを持っているように見えるので、あなたがここで何を求めているのかわかりません。ただし、このコードは機能します。

use strict;
use warnings;
use Text::CSV;

my $csv = Text::CSV->new ({
    binary => 1,
    sep_char => ';',
    eol => $/,                # to make $csv->print use newlines
    always_quote => 1,        # to keep your numbers quoted
});

while (my $row = $csv->getline( *DATA )) {
    $row->[8] =~ s/[\r\n]+//g;
    $csv->print(*STDOUT, $row);
}

__DATA__
"2030";"NH Amersfoort";"Stationsstraat 75";"3811 MH AMERSFOORT";"033-4221200";"www.nh-hotels.nl";"52.154316";"5.380036";"<UL class=stars><LI>
<LI>
<LI>
<LI></LI></UL>"
"2031";"NH Amsterdam Centre";"Stadhouderskade 7";"1054 ES AMSTERDAM";"020-6851351";"www.nh-hotels.com";"52.363075";"4.879458";"<UL class=stars><LI>
<LI>
<LI>
<LI></LI></UL>"
"2032";"NH Atlanta Rotterdam Hotel";"Aert van Nesstraat 4";"3012 CA ROTTERDAM";"010-2067800";"www.nh-hotels.com";"51.921028";"4.478619";"<UL class=stars><LI>
<LI>
<LI>
<LI></LI></UL>"

ポインタ:

eol's printでこのオプションを使用するText::CSVと、期待どおりの結果が得られます。つまり、改行を印刷します。私STDOUTは出力ハンドルとして使用しましたが、任意のファイルハンドルを使用できます。

なぜ置換が「機能しない」と言うのかわかりませんが、おそらくあなたは次のようなことをしたのではないかと思います。

my $foo = $row->[8];
$foo =~ s/[\r\n]//g;
print @$row;

これは、の値を変更するのでは$rowなく、のコピーだけを変更します$foo

于 2013-01-18T10:32:56.233 に答える