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
On 5 juin, 22:33, mentalo <ment...@spamthis.nul> wrote:
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
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
On 2007-06-06, Tittom wrote:
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".
On 2007-06-06, Tittom <thomas.bleton@gmail.com> wrote:
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".
Thierry B sur fr.comp.os.unix le mercredi 6 juin 2007 01:05
On 2007-06-05, mentalo wrote:
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
mentalo wrote:
Thierry B sur fr.comp.os.unix le mercredi 6 juin 2007 01:05
On 2007-06-05, mentalo wrote:
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
mentalo <mentalo@spamthis.nul> wrote:
Thierry B sur fr.comp.os.unix le mercredi 6 juin 2007 01:05
On 2007-06-05, mentalo <mentalo@spamthis.nul> wrote:
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
Thierry B sur fr.comp.os.unix le mercredi 6 juin 2007 01:05
On 2007-06-05, mentalo wrote:
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