Perl pour lire un fichier csv

Anne perl csv

Avec une librairie

Le mieux pour traiter des fichiers CSV est d’utiliser une librairie, comme Text::CSV par exemple.

Voilà un petit exemple où on utilise la ligne de titre pour indexer les données :

{
  my $infile = $ARGV[0] or die "Need to get CSV file on the command line\n";
  open(my $in, '<', $infile) or die "Can't read file '$infile' [$!]\n";

  my $csv = Text::CSV->new({
      sep_char => ',',
      allow_whitespace => 1, # ôte les espace en début et fin de champ.
    })
    or die "Cannot use Text::CSV: ".Text::CSV->error_diag();

  # read the header line and register the column names
  my @headings = @{$csv->getline ($in)};
  $csv->column_names (\@headings);

  while (my $row = $csv->getline_hr($in)) {
    print "Nom: $row->{Nom} - Prénom: $row->{Prenom}\n";
  }
  close $in or die "Failed to close $infile ($!)";
}

On peut faire encore plus simple en utilisant $csv->getline, ou encore $csv->parse ($line) puis @fields = $csv->fields (); pour récupérer les champs. On accède alors aux colonnes par numéro, ce qui est un peu moins pratique.

Sans librairie

Si on a un fichier CSV que l’on sait très simple (par exemple parce qu’on le génère), on peut faire encore plus simple, mais on ne profite alors pas de toutes les facilités ci-dessus :

{
  open(my $fh, '<', $file) or die "Can't read file '$file' [$!]\n";
  my @data;
  my $line = <$fh>;
  my @headings = split(/,/, $line);
  print "headings:", (join (',', @headings)), "\n";
  while ($line = <$fh>) {
    chomp $line;
    my @fields = split(/,/, $line);
    push @data, \@fields;
    print "Nom: $fields[3] - Prénom: $fields[4]\n";
  }
  close $fh or die "Failed to close $file ($!)";
}

Voir aussi :