2

私はこの形式のcsvファイルを持っています:

"Keyword"   "Competition"   "Global Monthly Searches"   "Local Monthly Searches (United States)"    "Approximate CPC (Search) - INR"

"kasperaky support" -0  -0  -0  -0

最初の行は列のタイトルです。

Text::CSV でほとんどのオプションを試しましたが、フィールドを抽出できません。

ここで sep_char=>' '

最も近いのは、最初の列の最初の単語を取得することです (「kasperaky」のみ)。

私はこの方法でオブジェクトを作成しています(さまざまな設定を試しながら):

my $csv = Text::CSV->new ( { 
    binary => 1 ,
    sep_char=>' ',allow_loose_quotes=>0,quote_space=>0,quote_char          => '"',
    ,allow_whitespace    =>0, eol=>"\015\012"
     } ) 
                 or die "Cannot use CSV: ".Text::CSV->error_diag ();
4

4 に答える 4

5

CSV はタブ区切りです。以下を使用します (コードは、サンプル ファイルに対して動作するようにテストされています)。

use strictures;
use autodie qw(:all);       # automatic error checking open/close
use charnames qw(:full);    # \N named characters
use Text::CSV qw();
my $csv = Text::CSV->new({
    auto_diag   => 2,       # automatic error checking CSV methods
    binary      => 1,
    eol         => "\N{CR}\N{LF}",
    sep_char    => "\N{TAB}",
}) or die 'Cannot use CSV: ' . Text::CSV->error_diag;

open my $fh, '<:encoding(ASCII)', 'computer crash.csv';
while (my $row = $csv->getline($fh)) {
    ...
}
close $fh;
于 2012-06-05T16:43:52.583 に答える
4

CSV ファイルと呼ぶのは少し無理が​​あります。セパレーターはスペースではなく、1 つ以上のスペースのシーケンスであり、Text::CSV はそれを処理しません。(allow_whitespace残念ながら、セパレーターがスペースの場合は機能しません。)次のようなものを使用できます。

use List::MoreUtils qw( apply );
my @fields = apply { s/\\(.)/$1/sg } $line =~ /"((?:[^"\\]|\\.)*)"/sg;

これらがタブである場合、それは別の話であり、sep_char => "\t".

于 2012-06-05T16:46:01.647 に答える
1

私は常にパーサーを使用することをお勧めします。通常、Text :: CSVは優れていますが、実際のCSVを使用していない場合は、問題が発生することがあります。この場合、コアモジュールを使用してみてくださいText::ParseWords

これが私の例です。

#!/usr/bin/env perl

use strict;
use warnings;

use Text::ParseWords qw/parse_line/;

my @data;
while( my $line = <DATA> ) {
  chomp $line;
  my @words = parse_line( qr/\s+/, 0, $line );
  next unless @words;
  push @data, \@words;
}

use Data::Dumper;
print Dumper \@data;

__DATA__

"Keyword"   "Competition"   "Global Monthly Searches"   "Local Monthly Searches (United States)"    "Approximate CPC (Search) - INR"

"kasperaky support" -0  -0  -0  -0

この実装は、未使用の行をスキップして、データの2D配列を構築します。もちろん、トークンを解析したら、必要なデータ構造を構築できます。

$VAR1 = [
          [
            'Keyword',
            'Competition',
            'Global Monthly Searches',
            'Local Monthly Searches (United States)',
            'Approximate CPC (Search) - INR'
          ],
          [
            'kasperaky support',
            '-0',
            '-0',
            '-0',
            '-0'
          ]
        ];
于 2012-06-09T16:18:08.823 に答える