Regexp pour CSV malformé

View: New views
4 Messages — Rating Filter:   Alert me  

Regexp pour CSV malformé

by Loïc Guitaut-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Salut à tous !

j'ai un petit soucis avec un csv malformé et je commence à m'arracher les
cheveux, donc je viens vous demander votre avis.

J'ai des lignes de ce type là :

blablabla, plop, "une jolie, description", 12, , , 5

Forcément quand je mets ça dans fastercsv ou équivalent, ça explose. J'ai donc
cherché du côté des regexp, mais j'ai rien trouvé qui m'aide vraiment. J'ai
fait tout un tas d'essais mais n'étant pas un gourou à ce niveau là, je
n'arrive pas à grand chose :/

Si quelqu'un a une solution pour soit splitter la ligne correctement ou
simplement la "normaliser" pour que ça passe dans un parser CSV, ça serait
vraiment cool !

merci :)
--
  ,= ,-_-. =.   Loïc Guitaut
 ((_/)o o(\_))  http://www.belfalas.org
  `-'(. .)`-'   Jabber ID : Flink@...
      \_/       GnuPG KeyID : 0xA78CD85D


signature.asc (196 bytes) Download Attachment

Re: Regexp pour CSV malformé

by Fabien Jakimowicz :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


2009/10/13 Loïc Guitaut <flink@...>:

> Salut à tous !
>
> j'ai un petit soucis avec un csv malformé et je commence à m'arracher les
> cheveux, donc je viens vous demander votre avis.
>
> J'ai des lignes de ce type là :
>
> blablabla, plop, "une jolie, description", 12, , , 5
>
> Forcément quand je mets ça dans fastercsv ou équivalent, ça explose. J'ai donc
> cherché du côté des regexp, mais j'ai rien trouvé qui m'aide vraiment. J'ai
> fait tout un tas d'essais mais n'étant pas un gourou à ce niveau là, je
> n'arrive pas à grand chose :/
>
> Si quelqu'un a une solution pour soit splitter la ligne correctement ou
> simplement la "normaliser" pour que ça passe dans un parser CSV, ça serait
> vraiment cool !
>

Il s'agit pourtant là d'une chaine correctement formée : une champ
d'une entrée CSV (une cellule donc) peut contenir des virgules (le
séparateur) voir même des sauts de ligne. Il convient alors d'isoler
la cellule entre guillemets.

--
http://fabien.jakimowicz.com
Sent from Paris, France

--~--~---------~--~----~------------~-------~--~----~
Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de Google Groups.
Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse railsfrance@...
Pour résilier votre abonnement envoyez un e-mail à l'adresse railsfrance-unsubscribe@...
-~----------~----~----~----~------~----~------~--~---


Re: Regexp pour CSV malformé

by Loïc Guitaut-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Le mardi 13 octobre 2009 16:04:20, Fabien Jakimowicz a écrit :

> 2009/10/13 Loïc Guitaut <flink@...>:
> > Salut à tous !
> >
> > j'ai un petit soucis avec un csv malformé et je commence à m'arracher les
> > cheveux, donc je viens vous demander votre avis.
> >
> > J'ai des lignes de ce type là :
> >
> > blablabla, plop, "une jolie, description", 12, , , 5
> >
> > Forcément quand je mets ça dans fastercsv ou équivalent, ça explose. J'ai
> > donc cherché du côté des regexp, mais j'ai rien trouvé qui m'aide
> > vraiment. J'ai fait tout un tas d'essais mais n'étant pas un gourou à ce
> > niveau là, je n'arrive pas à grand chose :/
> >
> > Si quelqu'un a une solution pour soit splitter la ligne correctement ou
> > simplement la "normaliser" pour que ça passe dans un parser CSV, ça
> > serait vraiment cool !
>
> Il s'agit pourtant là d'une chaine correctement formée : une champ
> d'une entrée CSV (une cellule donc) peut contenir des virgules (le
> séparateur) voir même des sauts de ligne. Il convient alors d'isoler
> la cellule entre guillemets.
>
Ben de ce que j'en avais compris, il fallait tout délimiter avec des
guillemets. En tout cas les parsers CSV que j'ai tester fonctionnent tous
comme ça.

Mais bon c'est pas très grave, juste après avoir posé la question, j'ai trouvé
la regexp magique grâce à mon ami google :) (pourtant c'est pas faut d'avoir
cherché)

Pour info, avec ça, ça marche :
/,(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))/

Et voilà !
--
  ,= ,-_-. =.   Loïc Guitaut
 ((_/)o o(\_))  http://www.belfalas.org
  `-'(. .)`-'   Jabber ID : Flink@...
      \_/       GnuPG KeyID : 0xA78CD85D


signature.asc (196 bytes) Download Attachment

Re: Regexp pour CSV malformé

by Bobo Bobo-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


Bonjour Joïc,

J'ai eu le même problème avec un CSV où il manquait même des colonnes !


Loïc Guitaut wrote:
> Le mardi 13 octobre 2009 16:04:20, Fabien Jakimowicz a écrit :
>> > Forcément quand je mets ça dans fastercsv ou équivalent, ça
>> explose. J'ai
>> séparateur) voir même des sauts de ligne. Il convient alors d'isoler
>> la cellule entre guillemets.


C'est une solutions.

>
> Pour info, avec ça, ça marche :
> /,(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))/
>
> Et voilà !

Je suis resté classique. La partie qui m'interesse est un
tableau de nombre.

La réponse est tardive, mais je n'ai fais ça que récemment.


=======================================================
requier 'csv'

NAME = "fichier_a_traiter.txt"

# Ouverture du fichier CVS avec ';' pour séparateur.
reader = CSV.open(NAME,'r',';')

# Il faut sauter les 12 premières lignes qui sont du commentaire.
header = reader
12.times do
  header=reader.shift
end
puts "\nDerniere ligne du Header pour controle :\n"
p header


# Création des tableau à partir du fichier et conversion du
# séparateur décimal : ',' -> '.'.
puts "\n\nTraitement du fichier de donnees : '#{NAME}'.\n"
tab_a = []
tab_b = []
tab_c = []
ascon = []
# Lecture du fichier et traitement de chaque ligne.
reader.each do |row|
  tab_a << row[3].tr(',','.').to_f
  tab_b << row[5].tr(',','.').to_f
  tab_c << 1000.0*row[4].tr(',','.').to_f
end
reader.close
=======================================================


Randy.
--
Posted via http://www.ruby-forum.com/.

--~--~---------~--~----~------------~-------~--~----~
Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de Google Groups.
Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse railsfrance@...
Pour résilier votre abonnement envoyez un e-mail à l'adresse railsfrance-unsubscribe@...
-~----------~----~----~----~------~----~------~--~---