Comment puis-je analyser CSV en Perl avec une regex?
Je vais avoir quelques problèmes avec l'analyse des données au format CSV, avec des guillemets. Mon principal problème avec les citations à l'intérieur d'un champ. Dans l'exemple suivant les lignes 1 - 4 fonctionne correctement, mais 5, 6 et 7 ne sont pas.
COLLOQ_TYPE,COLLOQ_NAME,COLLOQ_CODE,XDATA
S,"BELT,FAN",003541547,
S,"BELT V,FAN",000324244,
S,SHROUD SPRING SCREW,000868265,
S,"D" REL VALVE ASSY,000771881,
S,"YBELT,"V"",000323030,
S,"YBELT,'V'",000322933,
Je voudrais éviter Text::CSV comme il n'est pas installé sur le serveur cible. Réalisant que les CSV sont plus complexes qu'ils ne le regarde, je suis en utilisant une recette de Perl livre de cuisine.
sub parse_csv {
my $text = shift; #record containg CSVs
my @columns = ();
push(@columns ,$+) while $text =~ m{
# The first part groups the phrase inside quotes
"([^\"\\]*(?:\\.[^\"\\]*)*)",?
| ([^,]+),?
| ,
}gx;
push(@columns ,undef) if substr($text, -1,1) eq ',';
return @columns ; # list of vars that was comma separated.
}
Quelqu'un aurait-il une suggestion pour l'amélioration de la regex pour gérer les cas ci-dessus?
source d'informationauteur Mark Nold | 2009-03-11
Vous devez vous connecter pour publier un commentaire.
S'il vous plaît, Essayez d'Utiliser CPAN
Il n'y a aucune raison que vous ne pouvait pas télécharger une copie de Text::CSVou de toute autre non-XS en fonction de la mise en œuvre d'un fichier CSV et l'analyseur de l'installer dans votre répertoire local, ou dans un lib/sous-répertoire de votre projet jusqu'à sa installé le long de vos projets de déploiement.
Si vous ne pouvez pas stocker des fichiers texte dans votre projet, alors je me demande comment il est vous êtes le codage de votre projet.
http://novosial.org/perl/life-with-cpan/non-root/
Devrait être un bon guide sur comment obtenir ces dans un état de fonctionnement à l'échelle locale.
Pas utiliser CPAN est vraiment une recette pour un désastre.
Veuillez en tenir compte avant d'essayer d'écrire votre propre CSV mise en œuvre.
Text::CSV est plus d'une centaine de lignes de code, y compris la correction de bugs et des cas limites, et de ré-écrire ce à partir de zéro va juste vous faire savoir comment terrible CSV peut être à la dure.
note: j'ai appris à la dure. M'a fallu une journée entière pour obtenir un travail CSV analyseur en PHP avant, j'ai découvert une fonction intégrée de un a été ajouté dans une version ultérieure. C'est vraiment quelque chose d'affreux.
Vous pouvez analyser CSV à l'aide de Texte::Analysemots qui est livré avec Perl.
qui analyse votre fichier CSV correctement....
Le seul problème que j'ai eu avec le Texte::Analysemots est imbriquées les guillemets dans les données ne sont pas échappé correctement. Cependant c'est mal construit données au format CSV, et causerait des problèmes avec la plupart des CSV analyseurs 😉
De sorte que vous pouvez remarquer que
est sorti comme (ie. citations a chuté de près "V")
toutefois, si son échappé comme
puis les citations seront conservés
Cela fonctionne comme un charme
ligne est supposé être séparés par des virgules avec embeded ,
my @columns = Text::ParseWords::parse_line(',', 0, $line);
testé; de travail:-
être averti que les fichiers CSV peuvent contenir des cellules ayant incorporé des retours à la ligne à l'intérieur des citations, de sorte que vous aurez besoin de faire cela si la lecture des données en ligne-à-un-temps:
Trouver des paires à l'aide de regexs est non-trivial et généralement impossible à résoudre la tâche. Il y a beaucoup d'exemples dans l'Jeffrey Friedl est Mastering regular expressions livre. Je ne l'ai pas à portée de main, mais je me souviens qu'il a utilisé un fichier CSV pour quelques exemples, trop.
Vous pouvez (essayer de) utiliser CPAN.pm pour tout simplement avoir votre programme d'installation/de mise à jour Text::CSV. Comme dit avant, vous pouvez même "installer" pour une maison ou d'un répertoire, et ajouter ce répertoire à @INC (ou, si vous préférez ne pas utiliser
BEGIN
blocs, vous pouvezuse lib 'dir';
- c'est probablement mieux).Testé: