Как извлечь несколько столбцов из файла CSV с помощью Perl - PullRequest
1 голос
/ 16 февраля 2012

Я довольно новичок в Perl и надеялся, что кто-нибудь сможет мне помочь с этой проблемой.Мне нужно извлечь две колонки из файла CSV запятыми.Вот как выглядит формат:

"ID","URL","DATE","XXID","DATE-LONGFORMAT"

Мне нужно извлечь столбец DATE, столбец XXID и столбец сразу после XXID.Обратите внимание, что каждая строка не обязательно следует за одинаковым количеством столбцов.

Столбец XXID содержит двухбуквенный префикс и не всегда начинается с одной и той же буквы.Это может быть любая буква алфавита.Длина всегда одинакова.

Наконец, после извлечения этих трех столбцов мне нужно отсортировать по столбцу XXID и подсчитать дубликаты.

Ответы [ 3 ]

3 голосов
/ 16 февраля 2012

Вот пример сценария, использующего модуль Text :: CSV для анализа ваших данных CSV. Обратитесь к документации для модуля, чтобы найти правильные настройки для ваших данных.

#!/usr/bin/perl
use strict;
use warnings;
use Text::CSV;

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

while (my $row = $csv->getline(*DATA)) {
    print "Date: $row->[2]\n";
    print "Col#1: $row->[3]\n";
    print "Col#2: $row->[4]\n";
}
3 голосов
/ 17 февраля 2012

Я опубликовал модуль под названием Tie::Array::CSV, который позволяет Perl взаимодействовать с вашим CSV как собственным вложенным массивом Perl. Если вы используете это, вы можете взять свою логику поиска и применить ее так, как если бы ваши данные уже были в массиве ссылок на массивы. Взгляни!

#!/usr/bin/env perl

use strict;
use warnings;

use File::Temp;
use Tie::Array::CSV;
use List::MoreUtils qw/first_index/;
use Data::Dumper;

# this builds a temporary file from DATA
# normally you would just make $file the filename
my $file = File::Temp->new;
print $file <DATA>;
#########

tie my @csv, 'Tie::Array::CSV', $file;

#find column from data in first row
my $colnum = first_index { /^\w.{6}$/ } @{$csv[0]};
print "Using column: $colnum\n";

#extract that column
my @column = map { $csv[$_][$colnum] } (0..$#csv);

#build a hash of repetitions
my %reps;
$reps{$_}++ for @column;

print Dumper \%reps;
0 голосов
/ 16 февраля 2012

Вы определенно хотите использовать библиотеку CPAN для анализа CSV, поскольку вы никогда не будете учитывать все особенности этого формата.

Пожалуйста, смотрите: Как я могу проанализировать цитированный CSV в Perl с регулярным выражением?

Пожалуйста, смотрите: Как эффективно проанализировать файл CSV в Perl?

Однако, вот очень наивное и не идиоматическое решение для данной конкретной строки, которую вы предоставили:

use strict;
use warnings;

my $string = '"ID","URL","DATE","XXID","DATE-LONGFORMAT"';

my @words = ();
my $word = "";
my $quotec = '"';
my $quoted = 0;

foreach my $c (split //, $string)
{
  if ($quoted)
  {
    if ($c eq $quotec)
    {
      $quoted = 0;
      push @words, $word;
      $word = "";
    }
    else
    {
      $word .= $c;
    }
  }
  elsif ($c eq $quotec)
  {
    $quoted = 1;
  }
}

for (my $i = 0; $i < scalar @words; ++$i)
{
  print "column " . ($i + 1) . " = $words[$i]\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...