Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

remplacer les virgules dans un csv mal foutu

8 réponses
Avatar
Gamotte
Bonjour,

J'ai r=E9cup=E9r=E9 des donn=E9es au format csv =E0 partir d'une base, mais=
la
mise
en forme est vraiment p=E9nible au sens ou les chaines de caract=E8res 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
=E0 l'int=E9rieur des chaines pour pouvoir choisir la virgule comme
s=E9parateur de champs.
Dans l'exemple, il faudrait supprimer la virgule apr=E8s Riri.

Merci.

Yves

8 réponses

Avatar
ALain Montfranc
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'

Avatar
Jogo
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 -+-

Avatar
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

Avatar
Gamotte
On 2 juin, 15:20, Stephane Chazelas wrote:
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 ?


Avatar
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 ?


-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


Avatar
Gamotte
On 6 juin, 08:21, Jogo wrote:
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



Avatar
Jogo
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


Avatar
Gamotte
On 8 juin, 12:21, Jogo wrote:
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.