В Perl, как я могу прочитать файл и сохранить все содержимое файла в% hash в виде ключа и значений? - PullRequest
0 голосов
/ 12 ноября 2011

Привет, я новичок в программировании на Perl.Я пытаюсь прочитать файл .csv, в котором 2 поля разделены запятой.

Я хочу поместить все данные файла в хеш в виде ключа и его значения.

У меня есть входной файл

Данные

2.8, gitu

2.5,  Has


2.7  Hwait

3.1-weiity

4.2,  city

2.7:query

4.9,  city

16.2,  play

6.2,  game

7,,,8 Jami

4.0,  city

Эта строка кода не печатает все действительные данные, присутствующие во входном файле.Допустимые данные в виде строки, начинающейся с числа, между которым стоит запятая, а затем имя.В противном случае недействительные записи следует игнорировать.При печати %hashforHighMagnitude; пропускается несколько действительных записей, которые будут отображаться.Как я могу получить все действительные записи присутствующие %hashforHighMagnitude;

Я пытаюсь сделать это

open ( OF, "$inputFile") or die "Cant open input file: $!\n";
while ( $Line =<OF>) {

    if($Line =~ /^\d+\.+\d*\s*,\s*\w+$/g)              
    {
        ( my $magnitude, my $place ) = split(/,/,$Line);

        $hashforHighMagnitude{$place} = $magnitude;
        $hash{$place}++;
    }
    else
    {
        next;
    }
}

print %hashforHighMagnitude;

close(OF);

вывод должен быть

2.8, gitu

2.5,  Has

4.2,  city

4.9,  city

16.2,  play

6.2,  game

4.0,  city

Ответы [ 2 ]

6 голосов
/ 12 ноября 2011

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

Программа

#!/usr/bin/env perl

use strict;
use warnings;

use Text::CSV;

my $csv = Text::CSV->new( { 'allow_whitespace' => 1 } )
  or die Text::CSV->error_diag;

while ( my $row = $csv->getline( \*DATA ) ) {
    if ( @$row == 2 ) {
        print join( ', ', @$row ), "\n";
    }
}

__DATA__
2.8, gitu
2.5,  Has
2.7  Hwait
3.1-weiity
4.2,  city
2.7:query
4.9,  city
16.2,  play
6.2,  game
7,,,8 Jami
4.0,  city

Выход

2.8, gitu
2.5, Has
4.2, city
4.9, city
16.2, play
6.2, game
4.0, city
1 голос
/ 13 ноября 2011

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

$hashforHighMagnitude{$place} = $magnitude; 

на

$hashforHighMagnitude{$place} .=exists $hashforHighMagnitude{$place} ? "  $magnitude" :$magnitude;

вот и все.теперь я смог получить желаемый результат ... спасибо всем, что взглянули на мой запрос .....

...