2 votes

perl - traitement de texte - sortie vers un fichier csv

Existe-t-il un moyen en perl d'exporter des données d'un fichier vers un fichier csv. Ce que je veux dire, c'est que

Disons que j'ai un fichier comme suit..

field1=value1,filed2=value2
field1=value3,filed2=value4
field1=value5,filed2=value6

Je veux l'exporter au format excel comme suit.

field1  field2
value1  value2
value3  value4
value5  value6

Comment faire ?

Il y a aussi un petit problème ici. Supposons que j'exporte un autre fichier vers le même fichier CSV... qui a un contenu comme...

field1=value1,fields2=value8

mon CSV devrait ressembler à

field1  field2
value1  value2
        value8
value3  value4
value5  value6

existe-t-il un moyen plus simple de le faire ? Pour l'instant, je le fais manuellement. Savez-vous s'il existe une meilleure méthode ?

Merci.

3voto

Ether Points 34103

Jetez un coup d'œil à Texte::CSV (pour lire vos fichiers CSV dans des structures de données en perl) et Spreadsheet::WriteExcel (pour réécrire ces données au format Excel).

1voto

dalton Points 2456

Et voilà

#!/usr/bin/env perl

open (IMPORT, "import.txt") || die "Unable to read import file";

my @lines = <IMPORT>;
my @formatted = ();

for my $line (@lines) {
    $line =~ s/^.*=(.*?),.*?=(.*?)/$1\t$2/g;
    push(@formatted, $line);
}

my $current_field;

for my $format_line (sort @formatted) {
    my($field1, $field2) = (split(/\t/, $format_line));
    if ($field1 ne $current_field) {
        print "$field1";
    }
    print "\t$field2";

    $current_field = $field1;
}

import.txt contient

field1=value1,filed2=value2
field1=value3,filed2=value4
field1=value5,filed2=value6
field1=value1,fields2=value8

ce qui entraîne

value1  value2
        value8
value3  value4
value5  value6

0voto

cape1232 Points 762

Avant de lire un nouveau fichier, lisez le fichier csv cible (s'il n'est pas vide). Créez un hachage de hachages. La clé du premier hachage HashA sera les valeurs du champ1. La valeur d'une clé comme value1 sera un hachage HashB. HashB aura des clés qui sont les valeurs du champ2 qui correspondent à value1. La valeur d'une clé dans HashB sera simplement '1'. (La valeur n'a pas d'importance.)

Maintenant, lorsque vous voulez exporter un deuxième fichier, il vous suffit d'ajouter de nouvelles clés à HashB pour chaque clé de HashA.

Voici votre exemple.

D'abord vous faites le premier fichier pour obtenir

valeur1 -> { valeur2 -> 1 }
valeur3 -> { valeur4 -> 1 }
valeur5 -> { valeur6 -> 1 }

Maintenant, lorsque vous lisez dans le deuxième fichier avec la ligne field1=value1,field2=value8, vous ajoutez juste une clé à HashB pour value1

valeur1 -> { valeur2 -> 1, valeur8 -> 1 }
valeur3 -> { valeur4 -> 1 }
valeur5 -> { valeur6 -> 1 }

Maintenant, lorsque vous itérez sur HashA, vous imprimez les clés dans la colonne1 (pour le champ1) et vous imprimez chaque clé de HashB.

#!/usr/bin/perl

%hashA = ();

$hashA{"value1"}{"value2"} = 1;
$hashA{"value3"}{"value4"} = 1;
$hashA{"value5"}{"value6"} = 1;

foreach $value1 ( sort keys %hashA ) {
    foreach $value2 ( sort keys %{ $hashA{$value1} } ) {
        print "$value1, $value2\n";
    }
}

$hashA{"value1"}{"value8"} = 1;

print "\n\n";
foreach $value1 ( sort keys %hashA ) {
    foreach $value2 ( sort keys %{ $hashA{$value1} } ) {
        print "$value1, $value2\n";
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X