Traiter un gros fichier texte

Le
mentalo
Bonjour

Parlons bien parlons peu, avis aux amateurs. J'ai une grosse base à traiter.

Un fichier texte comporte :
31 colonnes délimitées par des " et , .
Par exemple :
"Colonne 1","colonne2",,,,,,,,"colonne 3",,,"colonne 4"

Les séries de ,, représentent les colonnes vides dans les lignes.
Par exemple :
,,, = ,"colonne-N-vide","colonne-N-vide"

Existerait-il une commande magique pleine d'argument pour faire ceci svp :

-Extraire chaque "colonne N" sans les , ni "

-Placer chaque colonne dans un nouveau fichier nommé comme la première ligne
de chaque colonne.

- Respecter l'ordre des lignes.

- Les lignes vides deviennent des sauts de lignes ou des caractères
identifiables (#### par exemple).

Merci aux éventuels courageux.
Questions / Réponses high-tech
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Thierry B
Le #740432
On 2007-06-05, mentalo

Merci aux éventuels courageux.


Perl et un parser de CSV ?


--
--{ http://tboudet.free.fr/ }--

Tittom
Le #740186
On 5 juin, 22:33, mentalo
Bonjour


Salut

Parlons bien parlons peu, avis aux amateurs. J'ai une grosse base à tra iter.


Je pense à un script awk, mais attention je ne sais pas si ma
proposition sera performante sur de gros fichiers.

Un fichier texte comporte :
31 colonnes délimitées par des " et , .
Par exemple :
"Colonne 1","colonne2",,,,,,,,"colonne 3",,,"colonne 4"


J'ai choisi comme exemple :
-------fichier.txt-------
"Col1","Col2","Col3","Col4",,"Col6"
"Valeur 1","Valeur 2","Val 3","La valeur 4",,"Val6"
"Champs 1","Champs 2","zone3","4",,"6"

"la zone 1","zone 2","zone3 de ligne 4","et de 4",,"Pour finir par 6"
------------------------------



[...]
-Extraire chaque "colonne N" sans les , ni "
-Placer chaque colonne dans un nouveau fichier nommé comme la premièr e ligne
de chaque colonne.
- Respecter l'ordre des lignes.
- Les lignes vides deviennent des sauts de lignes ou des caractères
identifiables (#### par exemple).


J'ai abouti à ça, n'étant pas expert c'est sûrement améliorable, voire
impertinent, mais ça semble marcher :o)

nawk -F "," -f scriptawk.awk fichier.txt
----------------scriptawk.awk-------------
{
# si c est la premiere ligne on recupere
# les noms de colonnes dans un tableau
if (NR == 1)
{
for (i=1 ; i<=NF ; i++)
{
# on supprime les guillemets de chaque nom de colonne
sub(/^"/, "", $i)
sub(/"$/, "", $i)
# on redirigera les colonnes sans nom vers /dev/null
if ($i == "") { noms_col[i] = "/dev/null" }
else { noms_col[i] = $i }
}
nbcol = i - 1
}
else
{
# on est sur une ligne > 1 donc on recupere les donnees
for (i=1 ; i<=nbcol ; i++)
{
sub(/^"/, "", $i)
sub(/"$/, "", $i)
print $i >noms_col[i]
}
}
}
--------------------------------------



Résultat obtenu :
========================
for f in Col* ; do echo "---------- $f ---------"; cat $f; done
---------- Col1 ---------

Valeur 1
Champs 1

la zone 1
---------- Col2 ---------
Valeur 2
Champs 2

zone 2
---------- Col3 ---------
Val 3
zone3

zone3 de ligne 4
---------- Col4 ---------
La valeur 4
4

et de 4
---------- Col6 ---------
Val6
6

Pour finir par 6
========================
J'espère que cela t'aidera

Thierry B
Le #739937
On 2007-06-06, Tittom

J'ai abouti à ça, n'étant pas expert c'est sûrement améliorable, voire
impertinent, mais ça semble marcher :o)

Hélas non, ça ne marche pas.


"Paf, la virgule","Champs 2","zone3","4",,"6"

Le CSV, c'est la galère à lire...

--
"Ubuntu" -- an African word, meaning "Slackware is too hard for me".

mentalo
Le #739936
Tittom sur fr.comp.os.unix le mercredi 6 juin 2007 14:48

On 5 juin, 22:33, mentalo
Bonjour


Salut

Salut et merci



nawk -F "," -f scriptawk.awk fichier.txt


J'obtiens une erreur :

$ awk -F "," -f script.awk fichier.txt
gawk: script.awk:8: if ($i == "") { noms_col[i] = "/dev/null" }
gawk: script.awk:8: ^ caractère invalide « ?» dans l'expression

J'ai effectué quelques tests avec cut, au bout de certains champs j'obtiens
ceci : ^M
Qu'est-ce que c'est ?

Merci


mentalo
Le #739935
Thierry B sur fr.comp.os.unix le mercredi 6 juin 2007 01:05

On 2007-06-05, mentalo

Merci aux éventuels courageux.


Perl et un parser de CSV ?


Je viens de jetter un oeil au module perl Parse::CSV, c'est visiblement ce

dont j'ai besoin. Maintenant pour l'appliquer c'ets une autre histoire.


talon
Le #739934
mentalo
Thierry B sur fr.comp.os.unix le mercredi 6 juin 2007 01:05

On 2007-06-05, mentalo

Merci aux éventuels courageux.


Perl et un parser de CSV ?


Je viens de jetter un oeil au module perl Parse::CSV, c'est visiblement ce

dont j'ai besoin. Maintenant pour l'appliquer c'ets une autre histoire.


Tu peux aussi envisager le module CSV de python, qui a l'avantage d'être
utilisable ...
http://www.commentcamarche.net/faq/sujet-2382-python-lire-et-ecrire-des-fichiers-csv


--

Michel TALON



Publicité
Poster une réponse
Anonyme