Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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

moko138 a écrit :

1) Les balises-code sont les < > (crochets bleus) de la barre de mise en forme.

Balisesmoko138.jpg
_ _ _

3) /!\  Si vous avez plusieurs retours à donner, séparez-les bien (toujours pour la lisibilité) :

comme
cela.

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 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( 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

ar barzh paour #4 a écrit :

@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 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( 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 )

Hors ligne

#8 Le 16/06/2024, à 09:13

pingouinux

Re : [Résolu] Saut de ligne fichier Csv

ar barzh paour #6 a écrit :

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 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( 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. wink

pour aller encore plus loin : man 7 regex
smile
et puis, s'exercer...
encore.... big_smile


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 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( 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 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( 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