Как загрузить файл CSV в хеш perl и получить доступ к каждому элементу - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть файл CSV со следующей информацией, разделенной запятыми ...

Owner,Running,Passing,Failing,Model
D42,21,54,543,Yes
T43,54,76,75,No
Y65,76,43,765,Yes

Я хочу открыть этот файл CSV и поместить его содержимое в хэш perl в моей программе.Меня также интересует код, необходимый для печати определенного элемента внутри has.Например, как я буду печатать счетчик «Passing» для «Владелец» Y65.

Код, который у меня сейчас есть:

$file = "path/to/file";

open $f, '<', $files, or die "cant open $file"

while (my $line = <$f>) {

#inside here I am trying to take the containments of this file and place it into a hash. I have tried numerous ways of trying this but none have seemed to work. I am leaving this blank because I do not want to bog down the visibility of my code for those who are kind enough to help and take a look. Thanks.

}

AS, а также размещение файла csv внутрихэш мне также нужно понимать синтаксис для печати и навигации по конкретным элементам.Заранее большое спасибо.

Ответы [ 2 ]

0 голосов
/ 15 сентября 2018

Поскольку не совсем понятно, что означает «загрузка CSV-файла в хеш-код perl» (Это также не имеет смысла. Массив хэшей, по одному на строку, может быть, если вы не заботитесь о сохранении порядка следования поля, но только хэш? Какие ключи должны быть?), давайте сосредоточимся на остальной части вашего вопроса, в частности

как я буду печатать счет "Passing" для "Владелец" Y65.

Есть несколько других CSV-модулей, которые могут быть интересны, и их гораздо проще использовать, чем Text::CSV:

  • Tie :: CSV_File позволяет получить доступ к CSV-файлу, например, к 2D-массиву. $foo[0][0] - это первое поле первой строки связанного файла.

Итак:

#!/usr/bin/perl
use warnings;
use strict;
use feature qw/say/;
use Tie::CSV_File;

my $csv = "data.csv";
tie my @data, "Tie::CSV_File", $csv or die "Unable to tie $csv!";
for my $row (@data) {
  say $row->[2] and last if $row->[0] eq "Y65";
}
  • DBD :: CSV позволяет обрабатывать CSV-файл как таблицу в базе данных, в которой можно выполнять SQL-запросы.

Итак:

#!/usr/bin/perl
use warnings;
use strict;
use feature qw/say/;
use DBI;

my $csv = "data.csv";
my $dbh = DBI->connect("dbi:CSV:", undef, undef,
                       { csv_tables => { data => { f_file => $csv } } })
  or die $DBI::errstr;
my $owner = "Y65";
my $p = $dbh->selectrow_arrayref("SELECT Passing FROM data WHERE Owner = ?",
                                 {}, $owner);
say $p->[0] if defined $p;
  • Text :: AutoCSV имеет множество удобных функций для работы с файлами CSV.

Итак:

#!/usr/bin/perl
use warnings;
use strict;
use feature qw/say/;
use Text::AutoCSV;

my $csv = "data.csv";
my $acsv = Text::AutoCSV->new(in_file => $csv) or die "Unable to open $csv!";
my $row = $acsv->search_1hr("OWNER", "Y65");
say $row->{"PASSING"} if defined $row;

Этот последний, вероятно, ближе всего к тому, что, я думаю, вы считаете нужным.

0 голосов
/ 15 сентября 2018

Вот пример того, как поместить данные в хеш %owners и позже (после прочтения файла) извлечь «счетчик проходов» для конкретного владельца. Я использую модуль Text::CSV для разбора строк файла.

use feature qw(say);
use open qw(:std :utf8);  # Assume UTF-8 files and terminal output
use strict;
use warnings qw(FATAL utf8);
use Text::CSV;

my $csv = Text::CSV->new ( )
  or die "Cannot use CSV: " . Text::CSV->error_diag ();
my $fn = 'test.csv';
open my $fh, "<", $fn
  or die "Could not open file '$fn': $!";
my %owners;
my $header = $csv->getline( $fh );  # TODO: add error checking 
while ( my $row = $csv->getline( $fh ) ) {
    next if @$row == 0; # TODO: more error checking
    my ($owner, @values) = @$row;
    $owners{$owner} = \@values;
}
close $fh;

my $key = 'Y65';
my $index = 1;
say "Passing count for $key = ", $owners{$key}->[$index];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...