2009-06-03 9 views
1

J'ai un fichier CSV qui a été extrait d'un système de ticketing (je n'ai aucun accès direct à la base de données) et j'ai besoin d'ajouter deux colonnes à une autre base de données avant de créer des rapports dans Excel.Comment puis-je ajouter des caractères à une ligne dans un fichier?

J'utilise Perl pour extraire des données de l'autre base de données et je souhaite simplement ajouter les colonnes supplémentaires à la fin de chaque ligne lorsque je traite le fichier.

Y at-il un moyen de le faire sans avoir à créer un nouveau fichier? La structure de base est:

foreach $line (@lines) { 
    my ($vars here....) = split (',',$line); 
    ## get additional fields 
    ## append new column data to line 
} 

Répondre

3

Vous pouvez utiliser Tie :: File (dans le noyau Perl depuis Perl 5.8) pour modifier un fichier en place:

#!/usr/bin/perl 

use strict; 
use warnings; 

use Tie::File; 


my $file = shift; 

tie my @lines, "Tie::File", $file 
    or die "could not open $file: $!\n"; 

for my $line (@lines) { 
    $line .= join ",", '', get_data(); 
} 

sub get_data { 
    my $data = <DATA>; 
    chomp $data; 
    return split /-/, $data 
} 

__DATA__ 
1-2-3-4 
5-6-7-8 

Vous pouvez également utiliser en place-édition avec le @ARGV/<> astuce en définissant $^I:

#!/usr/bin/perl 

use strict; 
use warnings; 

$^I = ".bak"; 

while (my $line = <>) { 
    chomp $line; 
    $line .= join ",", '', get_data(); 
    print "$line\n"; 
} 

sub get_data { 
    my $data = <DATA>; 
    chomp $data; 
    return split /-/, $data 
} 

__DATA__ 
1-2-3-4 
5-6-7-8 
+0

La deuxième option fonctionne pour moi, moins de bibliothèques à télécharger, etc. Également éliminé environ 10 lignes de mon code. – MattS

+0

Tie :: File fait partie de Core Perl depuis 5.8 (bien 5.7.3, mais c'était une version de développement). –

+0

Notez que ceux-ci fonctionnent tant qu'aucun des champs de l'enregistrement ne peut avoir des espaces verticaux. Cela semble stupide, mais si vous jouez avec CSV assez longtemps, vous finirez par rencontrer quelqu'un qui fait cela. :) –

0

Tenir compte en utilisant l'option -i modifier <> fichiers en place.

7

Vous pouvez regarder DBD::CSV pour traiter le fichier comme s'il s'agissait d'une base de données (qui traiterait également des caractères spéciaux d'échappement pour vous).

1

En dépit de toutes les belles interfaces, vous devez éventuellement lire le fichier ligne par ligne. Vous pourriez même devoir faire plus que si certains champs entre guillemets peuvent avoir des retours à la ligne incorporés. Utilisez quelque chose qui connaît CSV pour éviter certains de ces problèmes. Text::CSV_XS devrait vous épargner la plupart des tracas des cas impairs.

Questions connexes