remplacer les virgules dans un csv mal foutu

Le
Gamotte
Bonjour,

J'ai récupéré des données au format csv à partir d'une base, mais=
la
mise
en forme est vraiment pénible au sens ou les chaines de caractères ne
sont mises entre guillemets que si elles contiennent des virgules.

exemple de ligne du fichier

Bob et Bobette, "Riri, Fifi et Loulou", Tintin et milou,

Comme je veux faire un traitement avec awk, je voudrais supprimer les
virgules
à l'intérieur des chaines pour pouvoir choisir la virgule comme
séparateur de champs.
Dans l'exemple, il faudrait supprimer la virgule après Riri.

Merci.

Yves
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
ALain Montfranc
Le #737242
Gamotte a écrit
Bonjour,

J'ai récupéré des données au format csv à partir d'une base, mais la
mise
en forme est vraiment pénible au sens ou les chaines de caractères ne
sont mises entre guillemets que si elles contiennent des virgules.

exemple de ligne du fichier

Bob et Bobette, "Riri, Fifi et Loulou", Tintin et milou, ...

Comme je veux faire un traitement avec awk, je voudrais supprimer les
virgules
à l'intérieur des chaines pour pouvoir choisir la virgule comme
séparateur de champs.
Dans l'exemple, il faudrait supprimer la virgule après Riri.

Merci.

Yves


sed 's/("[^,"]*),([^,"]*")/12/g'

Jogo
Le #741938
Sur fr.comp.os.unix, ALain Montfranc disait :

sed 's/("[^,"]*),([^,"]*")/12/g'


Cette solution ne marche pas si il y a plus d'une virgule par champ.
Je propose :

perl -pe 'while (s/("[^,"]+),([^"]+")/$1$2/g) {}'

Mais si il n'y a que des virgules entre les "guillemets" aucune
substitution n'est effectuée.

--
pardon mais je suis oblige de faire ce test ici, et pas sur fr.test
-+- L2 in www.le-gnu.net - Bien prendre les gens pour des cons -+-

Stephane Chazelas
Le #741704
2007-06-01, 08:56(-07), Gamotte:
Bonjour,

J'ai récupéré des données au format csv à partir d'une base, mais la
mise
en forme est vraiment pénible au sens ou les chaines de caractères ne
sont mises entre guillemets que si elles contiennent des virgules.

exemple de ligne du fichier

Bob et Bobette, "Riri, Fifi et Loulou", Tintin et milou, ...

Comme je veux faire un traitement avec awk, je voudrais supprimer les
virgules
à l'intérieur des chaines pour pouvoir choisir la virgule comme
séparateur de champs.
Dans l'exemple, il faudrait supprimer la virgule après Riri.
[...]


awk -F" -v OFS=" '{for (i=2;i<=NF;i+=2)
gsub(/,/,"",$i);print}'

ou:

perl -pe 's/".*?"/($a=$&)=~s@,@@g,$a/ge'

--
Stéphane

Gamotte
Le #741456
On 2 juin, 15:20, Stephane Chazelas
2007-06-01, 08:56(-07), Gamotte:

Bonjour,

J'ai récupéré des données au format csv à partir d'une base, mais la
mise
en forme est vraiment pénible au sens ou les chaines de caractères ne
sont mises entre guillemets que si elles contiennent des virgules.

exemple de ligne du fichier

Bob et Bobette, "Riri, Fifi et Loulou", Tintin et milou, ...

Comme je veux faire un traitement avec awk, je voudrais supprimer les
virgules
à l'intérieur des chaines pour pouvoir choisir la virgule comme
séparateur de champs.
Dans l'exemple, il faudrait supprimer la virgule après Riri.


[...]

awk -F" -v OFS=" '{for (i=2;i<=NF;i+=2)
gsub(/,/,"",$i);print}'

ou:

perl -pe 's/".*?"/($a=$&)=~s@,@@g,$a/ge'

--
Stéphane


Merci à tous.

Est-ce que j'abuse en demandant des explications sur la commande
perl ci-dessus ?


Jogo
Le #740431
Sur fr.comp.os.unix, Gamotte disait :

perl -pe 's/".*?"/($a=$&)=~s@,@@g,$a/ge'


Est-ce que j'abuse en demandant des explications sur la commande
perl ci-dessus ?


-pe => Pour chaque ligne de stdin interpréter le script donné en
paramètre.

s/".*?"/.../ge => Substituer tout les occurences d'une chaine entre
" (inclus) par le résultat de l'expression.

$a=$& => La variable $a contient l'occurence à transformer.

(...) =~ s@,@@g => Dans $a remplacer toutes les occurences de , par
rien.

,$a => Retourner $a.

--
tout rapport sexuel de l'un ou l'autre avec un tiers devrait être
considéré comme une expérience joyeuse et agréable que votre partenaire
peut partager dans son coeur et parfois même physiquement


Gamotte
Le #740430
On 6 juin, 08:21, Jogo
Sur fr.comp.os.unix, Gamotte disait :

perl -pe 's/".*?"/($a=$&)=~s@,@@g,$a/ge'


Est-ce que j'abuse en demandant des explications sur la commande
perl ci-dessus ?


[...]


(...) =~ s@,@@g => Dans $a remplacer toutes les occurences de , par
rien.


D'accord. C'est surtout les '@' qui m'avaient perturbé. Donc, si j'ai
bien compris,
ce caractère équivaut à / (slash protégé), et il faut l'utiliser
parcequ'on est déja
dans une commande de substitution.

Merci



Jogo
Le #739681
Sur fr.comp.os.unix, Gamotte disait :

(...) =~ s@,@@g => Dans $a remplacer toutes les occurences de , par
rien.


D'accord. C'est surtout les '@' qui m'avaient perturbé. Donc, si j'ai
bien compris,
ce caractère équivaut à / (slash protégé),


Non, ça ne marcherait pas avec /. En fait peu importe le caractère
après le s. On n'utilise / que par habitude, mais on peut mettre
n'importe quoi. Là comme on a une substitution dans une substitution,
il faut utiliser 2 caractères différents. Personnellement j'aurais
plutot utilisé : (par habitude et parce que @ a déjà une sinification
en Perl).

--
Lorsque l'on a exclu de l'art le but de moraliser et d'améliorer les
hommes, il ne s'en suit pas encore que l'art doive être absolument
sans fin, sans but et dépourvu de sens, en un mot, l'art pour l'art.
-- Nietzsche


Gamotte
Le #739114
On 8 juin, 12:21, Jogo
Sur fr.comp.os.unix, Gamotte disait :

(...) =~ s@,@@g => Dans $a remplacer toutes les occurences de , p ar
rien.


D'accord. C'est surtout les '@' qui m'avaient perturbé. Donc, si j'ai
bien compris,
ce caractère équivaut à / (slash protégé),


Non, ça ne marcherait pas avec /. En fait peu importe le caractère
après le s. On n'utilise / que par habitude, mais on peut mettre
n'importe quoi. Là comme on a une substitution dans une substitution,
il faut utiliser 2 caractères différents. Personnellement j'aurais
plutot utilisé : (par habitude et parce que @ a déjà une sinificati on
en Perl).



OK, merci pour ces explications claires.



Publicité
Poster une réponse
Anonyme