#1 Le 15/06/2024, à 18:20
- jojo260
[Résolu] Saut de ligne fichier Csv
Bonjour à tous
Je suis débutant et j'aurais besoin de votre aide. J'ai un fichier Csv et j'aimerais introduire un saut de ligne tous les 5 champs. Voici un exemple.
Champs1|Champs2| Champs3| Champs4| Champs5| Champs6| ...| Champs25|
A|B|C|D|E|F|G|||||Y|
et j'aimerais obtenir:
Champs1|Champs2| Champs3| Champs4| Champs5|
A|B|C|D|E|
F|G|H|I|J
....
U|V|W|X|Y
Merci de l'aide que vous pourrez m'apporter.
Dernière modification par jojo260 (Le 30/06/2024, à 10:04)
Hors ligne
#2 Le 15/06/2024, à 18:33
- xubu1957
Re : [Résolu] Saut de ligne fichier Csv
Bonjour,
Pour ajouter toi-même les balises code à ton message #1 :
Cliquer sur le lien « Modifier » en bas à droite du message
Sélectionner le texte
Cliquer sur le <> de l'éditeur de message
Comme demandé dans le premier message du tutoriel Retour utilisable de commande
Champs1|Champs2| Champs3| Champs4| Champs5| Champs6| ...| Champs25|
A|B|C|D|E|F|G|||||Y|
et j'aimerais obtenir:
Champs1|Champs2| Champs3| Champs4| Champs5|
A|B|C|D|E|
F|G|H|I|J
....
U|V|W|X|Y
Conseils pour les nouveaux demandeurs et pas qu'eux
Important : Pensez à passer vos sujets en [Réso|u] lorsque ceux-ci le sont, au début du titre en cliquant sur Modifier sous le premier message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci. Membre de Linux-Azur
En ligne
#3 Le 15/06/2024, à 20:27
- pingouinux
Re : [Résolu] Saut de ligne fichier Csv
Bonsoir,
Ceci ?
sed -r 's/(([^|]+\|){5})/\1\n/g' fichier.csv
Hors ligne
#4 Le 16/06/2024, à 06:50
- ar barzh paour
Re : [Résolu] Saut de ligne fichier Csv
@pingouinux
oui mais
se perd quand un champ est vide ?
Champs1|Champs2|| Champs4| Champs5| Champs6|a|b|c|d|e|f|g|h|i|j|k| ...| Champs25|
jpb@jpb-u22-04-a6:~$ sed -r 's/(([^|]+\|){5})/\1\n/g' champ.txt
Champs1|Champs2|| Champs4| Champs5| Champs6|a|b|
c|d|e|f|g|
h|i|j|k| ...|
Champs25|
jpb@jpb-u22-04-a6:~$
mais avec une espace dans le champ3 c'est bon
Champs1|Champs2| | Champs4| Champs5| Champs6|a|b|c|d|e|f|g|h|i|j|k| ...| Champs25|
jpb@jpb-u22-04-a6:~$ sed -r 's/(([^|]+\|){5})/\1\n/g' champ.txt
Champs1|Champs2| | Champs4| Champs5|
Champs6|a|b|c|d|
e|f|g|h|i|
j|k| ...| Champs25|
jpb@jpb-u22-04-a6:~$
Dernière modification par ar barzh paour (Le 16/06/2024, à 07:00)
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : Intel(R) Core(TM)2 Duo CPU T6570 @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 22.04 ( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#5 Le 16/06/2024, à 06:59
- pingouinux
Re : [Résolu] Saut de ligne fichier Csv
@pingouinux
oui mais
se perd quand un champ est vide
Exact. Essayer ceci :
sed -r 's/(([^|]*\|){5})/\1\n/g' fichier.csv
Hors ligne
#6 Le 16/06/2024, à 07:40
- ar barzh paour
Re : [Résolu] Saut de ligne fichier Csv
subtil
essai d'explication
1-
[^|]+\| cherche une chaîne sans | suivi de | par exemple xxxx|
remarque : je ne sais pas pourquoi le résultat donne jusqu'à |a|b|
[^|]*\/ cherche une chaîne sans pipe même vide suivi de |
par exemple xxx| mais ici | tout seul ira bien
2-
{5} on recherche 5 fois cette chaîne
3-
mis entre parenthèse : on mémorise
4-
\1\n on ajoute à ce qui est mémorisé un saut de ligne
5-
/g : sur tout le fichiersur toute la ligne en cours
sed est une commande très puissante !!
Dernière modification par ar barzh paour (Le 18/06/2024, à 18:56)
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : Intel(R) Core(TM)2 Duo CPU T6570 @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 22.04 ( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#7 Le 16/06/2024, à 08:07
- Sciensous
Re : [Résolu] Saut de ligne fichier Csv
en moins subtil
sed -r 's/(([^|]?+\|){5})/\1\n/g'
à l'air bon aussi
qu'en penses-tu ar barzh paour ?
antiX 19 et 21 et Ubuntu 20.04 et 22.04
( sous LXDE et gnome-shell )
En ligne
#8 Le 16/06/2024, à 09:13
- pingouinux
Re : [Résolu] Saut de ligne fichier Csv
remarque : je ne sais pas pourquoi le résultat donne jusqu'à |a|b|
...............................;
2-
{5} on recherche 5 fois cette chaîne
Les 5 chaînes doivent être consécutives, et ici le décompte est interrompu par la chaîne vide.
5-
/g : sur tout le fichier
Non. L'opération est répétée seulement sur la ligne en cours de traitement.
Hors ligne
#9 Le 19/06/2024, à 08:06
- ar barzh paour
Re : [Résolu] Saut de ligne fichier Csv
@Sciencous
on voit bien que "ça marche"
mais j'aurai eu du mal à trouver : ?+ 0 ou 1 fois , 1 à n fois
c'est quand même tordu !!!!! ( je n'utilise les Expressions rationnelles que vraiment occasionnellement)
[^|]?+
dans le cas ou l'on a || (deux pipes consécutifs) , le décompte comme l'appelle pingouinux n'est pas interrompu
je note ça dans mes archives
bon maintenant
@jojo260
est-ce que ça te convient ?
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : Intel(R) Core(TM)2 Duo CPU T6570 @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 22.04 ( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#10 Le 19/06/2024, à 23:02
- jojo260
Re : [Résolu] Saut de ligne fichier Csv
Merci c'est parfait, je comprend mieux le fonctionnement du sed
Hors ligne
#11 Le 20/06/2024, à 04:09
- Watael
Re : [Résolu] Saut de ligne fichier Csv
tant mieux! parce qu'ici c'est subtile.
pour aller encore plus loin : man 7 regex
et puis, s'exercer...
encore....
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#12 Le 20/06/2024, à 09:13
- ar barzh paour
Re : [Résolu] Saut de ligne fichier Csv
@jojo
merci de modifier le titre de la discussion en cliquant sur Modifier du post #1
transforme le titre
Saut de ligne fichier Csv
en
[Résolu] Saut de ligne fichier Csv
puis valide la modification
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : Intel(R) Core(TM)2 Duo CPU T6570 @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 22.04 ( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#13 Le 20/06/2024, à 13:45
- kamaris
Re : [Résolu] Saut de ligne fichier Csv
Une version awk, peut-être moins compacte mais sans doute plus lisible, et puis awk est fait pour ça :
awk 'BEGIN { FS = OFS = "|" } { for (n = 1; n <= NF; n += 5) print $n, $(n+1), $(n+2), $(n+3), $(n+4) }' fichier
Hors ligne
#14 Le 21/06/2024, à 09:03
- ar barzh paour
Re : [Résolu] Saut de ligne fichier Csv
@ kamaris
en plus (sur mon PC) pour exécuter le fichier de 10000 lignes identiques suivant
Champs1|Champs2|| Champs4| Champs5| Champs6|a|b|c|d|e|f|g|h|i|j|k| ...| Champs25|
awk met 0,230 secondes
et
sed met 0,285 secondes
je suis surpris du résultat, j'aurais pensé l'inverse
bon maintenant ça dépend si on accorde ou pas de l'intéret au temps d'exécution
Dernière modification par ar barzh paour (Le 21/06/2024, à 09:04)
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : Intel(R) Core(TM)2 Duo CPU T6570 @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 22.04 ( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#15 Le 21/06/2024, à 09:47
- kamaris
Re : [Résolu] Saut de ligne fichier Csv
Le découpage des lignes en champs étant builtin avec awk, c'est probablement plus rapide.
L'avantage aussi avec awk, c'est qu'il formate la sortie comme doit l'être un fichier csv, même s'il manque des champs dans la source.
Exemple :
$ cat f
1|2|3|4|5|6|7|8|9|10|11|12
$ sed -r 's/(([^|]+\|){5})/\1\n/g' f
1|2|3|4|5|
6|7|8|9|10|
11|12
$ awk 'BEGIN { FS = OFS = "|" } { for (n = 1; n <= NF; n += 5) print $n, $(n+1), $(n+2), $(n+3), $(n+4) }' f
1|2|3|4|5
6|7|8|9|10
11|12|||
$
Je pense que le formatage effectué par awk, sans pipe en fin de ligne (qui signifierait qu'il y a un sixième champ vide) est le bon (indépendamment de la demande de départ qui est un mélange des deux formats), et ajouter des pipes sur la dernière ligne pour les champs vides est aussi le résultat attendu.
Tout ça awk le fait tout seul car il est fait pour.
Hors ligne
#16 Le 30/06/2024, à 10:02
- jojo260
Re : [Résolu] Saut de ligne fichier Csv
@kamaris @pingouinux
Merci ca foncionne parfaitement
Hors ligne