Regexp pour CSV malformé

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 :confused:

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 :slight_smile:

2009/10/13 Loïc Guitaut [email protected]:

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 :confused:

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

Le mardi 13 octobre 2009 16:04:20, Fabien J. 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.

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 :slight_smile: (pourtant c’est pas faut
d’avoir
cherché)

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

Et voilà !

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 J. 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.