【问题标题】:reading and changing .txt file via Hash Table通过哈希表读取和更改 .txt 文件
【发布时间】:2013-03-26 10:40:32
【问题描述】:

我正在努力了解如何设置哈希表 - 如果我了解“Perl 简介”一书以及网络上的各种建议等,我想这是我需要的。我必须阅读.text/csv 文件,看起来像这样 - 分号和所有:

PRENOM;NOM;SEXE;AGE;PAYS;TITRE;GENRE
Cédrick;Matisse;m;25-45;Belgique;La peinture de l'amour;romance
Anne-Pascale;Ork;f;15-25;Belgique;La dernière halte des elfes;fantastique
Anne-Pascale;Ork;f;15-25;Belgique;La tentation du gobelin;fantastique

....它只是和提取。

我想 1) 我应该将所有这些放入一个哈希表中,以便读取所要求的个人信息:性别、年龄、书籍类型。但是,我似乎无法理解如何将其加载到哈希表中——即使在阅读了各种帖子和“the”Perl 书之后。我一直在使用的代码如下所示:

use strict;
use warnings;

my $fichier = $ARGV[0]; # fichier source

open( DONNEES, '<', $fichier )
or die("Impossible d'ouvrir le fichier $fichier\n");

my %sexe = ( 'f' => 0, 'm' => 0);

my %age = ( '0-15' => 0, '15-25' => 0, '25-45' => 0, '45-65' => 0, '65-' => 0 );

my %genre = ( 'art' => 0, 'divers' => 0, 'education' => 0,
         'essai' => 0, 'fantastique' => 0, 'informatique' => 0,
         'pratique' => 0, 'roman' => 0, 'romance' =>0,
         'sci-fi' => 0);

my $sexe = 0;
my $sexem = 0;

print "$fichier\n";

while ( my $ligne = <DONNEES> ) {

chomp($ligne);

# decoupage de chaque ligne du fichier en 6 colonnes
my ($prenom, $nom, $sexe, $age, $pays, $livre, $genre ) = split( /\t/, $ligne );

等等……

在处理已在其中放置空格的文档时,使用数组似乎很容易,将它们放在一列中并阅读它们。但是,这里有更多信息。 问题是

1) 如何让我的程序忽略文档的第一行 (PRENOM;NOM;etc)?

2) 我怎样才能将所需的项目分隔并放置到正确的哈希表中?程序用分号读取整行是问题之一吗?

我没有再包括任何内容,因为这是一个班级的作业,这意味着我必须自己解决其余的问题。在能够阅读上面提到的各个元素之后,我的程序只需打印出有多少“女性”或“男性”,有多少阅读“浪漫”等。

最后,如果问题不清楚或者/并且我在叫错树,请不要犹豫,指出我正确的方向。

【问题讨论】:

    标签: perl


    【解决方案1】:

    有很多模块可以帮助您完成这项任务。例如,Text::CSV::Slurp 将 CSV 转换为哈希数组。

    【讨论】:

    • 好的,我现在去看看。谢谢,这是一个开始。
    • 我刚刚快速浏览了 Text::CSV::Slurp。实际上这是课程的后期部分,我想是在复活节假期之后。我必须说我不确定老师为什么不先给我们看这个,尽管我猜他有别的想法。
    • 我快速查看并尝试将“use text::csv::slurp”包含到我的程序中,以及一些用于转换 .csv 文件的代码。但是,我注意到警告告诉我程序找不到 text/csv/slurp.pm .. 这是否意味着我必须下载一个文件并将其放入我的 Perl 程序中?
    • 是的,它是一个 CPAN 模块,您可以使用以下命令安装它:cpan install Text::CSV::Slurp
    【解决方案2】:

    我相信Tie::Array::CSV 真的很接近你的需要:

    #!/usr/bin/env perl
    
    use strict;
    use warnings;
    
    use Tie::Array::CSV;
    
    sub get_column {
      my $last = int rand 10;
      return map { rand 100 } (0..$last);
    }
    
    tie my @out, 'Tie::Array::CSV', 'outfile.csv';
    
    for my $column (0..9) {
      my $row = 0;
      $out[$row++][$column] = $_ for get_column();
    }
    

    另请参阅 post by the author 解释该模块背后的原因。

    【讨论】:

    • 再次感谢。但是我的文件也可以是文本,这有什么不同吗?正如我上面提到的,我的警告一直告诉我它无法找到 TEXT::CSV::SLURP.pm ...这是什么,我在哪里可以找到它?
    • 刚刚为您的网站添加了书签,该网站看起来包含有用的信息,很好的发现,谢谢。
    • 您可能需要从 CPAN 安装它。
    猜你喜欢
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    相关资源
    最近更新 更多