2010-11-02 50 views
1

que j'ai un fichier CSV avec des milliers de lignes similaires à celui-ci ci-dessous:Perl: Mettre à jour un champ dans chaque ligne d'un fichier CSV

1, fred, forgeron, « 11, avenue Erewhon », "XYZ Société, 101 la route "," 020 123456 ", Royaume-Uni

Je voudrais utiliser Perl pour mettre à jour le champ de numéro de téléphone uniquement dans le fichier CSV. Je pense que Text :: CSV est la meilleure solution, mais je ne sais pas comment l'utiliser pour mettre à jour un champ et le réécrire.

Répondre

4

Je dois RTFM - Je pense que cela va le faire:

use Text::CSV; 

my @rows; 
my $csv = Text::CSV->new ({ binary => 1 }) # should set binary attribute. 
      or die "Cannot use CSV: ".Text::CSV->error_diag(); 

open my $fh, "<:encoding(utf8)", "test.csv" or die "test.csv: $!"; 
while (my $row = $csv->getline($fh)) { 
    $row->[6] = get_new_tel_number(); 
    push @rows, $row; 
} 
$csv->eof or $csv->error_diag(); 
close $fh; 

$csv->eol ("\r\n"); 

open $fh, ">:encoding(utf8)", "new.csv" or die "new.csv: $!"; 
$csv->print ($fh, $_) for @rows; 
close $fh or die "new.csv: $!"; 
+0

ont peut-être deux descripteurs de fichiers ouverts - un pour l'entrée et une pour la sortie. De cette façon, vous pouvez lire et traiter chaque ligne à tour de rôle et n'avez pas besoin d'un tableau @rows potentiellement très grand. –

+0

@davorg - bonne idée. Merci. – FunLovinCoder

+0

+1 pour RTFM .... – Axeman