2011-02-16 2 views
0

Je construis la logique de transformation d'un fichier qui applique certaines règles de transformation aux champs du fichier. Exemple de ces règles de transformation sont:Logique de transformation Perl - traitement de fichier ou DB

  • valeurs par défaut de réglage pour certains champs si elles sont vides (si la colonne 5 est vide, il est réglé sur « vide »)
  • Résumant le fichier en fonction de certaines colonnes (si le fichier a col1, col2 et col3, résumer fichier à agréger col3 pour tous col1)
  • cordes Substituer dans certains domaines (remplacer tous les "hache" dans col1 avec "ay")
  • Etc.

d'un perspective de performance, quand d en effectuant ces transformations sur un gros fichier, vaut-il mieux le faire en utilisant un traitement de fichier simple (lire le fichier ligne par ligne, utiliser des hachages pour résumer, regexes pour d'autres transformations etc.) ou charger les données dans une table de base de données. appliquer toute la logique de transformation et le télécharger dans un fichier?

Eg summarization:

fichier original a:

A | B | C | 100 | 200 | 300

A | B | C | 200 | 100 | 0

A | X | C | 100 | 100 | 100

fichier Transformé a:

A | B | 300 | 300 | 300

A | X | 100 | 100 | 100

+0

Pouvez-vous clarifier le contenu de col3? Est-ce que col3 est le même dans chaque rangée? Si vous changiez une ligne, cela changerait-il la col3 d'une autre rangée? – Tim

+0

Oui, les règles s'appliquent donc à toutes les valeurs col3 de chaque ligne. – Chris

+0

Quelle est la taille des fichiers? Combien de lignes? Quelle est la quantité de RAM de l'ordinateur? –

Répondre

0

La meilleure solution serait de coder le système dans les deux sens et prendre des mesures pour décider ce qui est mieux.

1

En supposant que les données que vous avez donné, ce problème est bien à la portée de Perl sans une base de données:

my %data; 
while (my $line = <DATA>) { 
    chomp $line; 
    my ($c1, $c2, undef, @cols) = split /\|/, $line, -1; 

    $data{"$c1|$c2"}[$_] += $cols[$_] for 0 .. $#cols; 
} 

print join('|' => $_, @{ $data{$_} }), "\n" for sort keys %data; 

__DATA__ 
A|B|C|100|200|300 
A|B|C|200|100|0 
A|X|C|100|100|100 

qui imprime:

 
A|B|300|300|300 
A|X|100|100|100 

Vous aurez bien sûr besoin de coder les transformations restantes , mais cela devrait vous donner un début. Même s'il s'avère que vous devez accéder aux lignes brutes plus d'une fois, en supposant que vos données ne sont pas gigantesques, vous pouvez les charger dans un tableau à deux dimensions, puis les passer au-dessus. Ou vous pouvez utiliser Tie::File pour accéder à un très gros fichier sans le lire.

+0

Et vous pensez que ce code perl est plus efficace que d'utiliser une base de données pour un fichier qui a des millions de lignes? – Chris

Questions connexes