Supprimer saut de ligne sous UNIX

Fermé
Karen - 24 nov. 2008 à 16:42
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 - 26 nov. 2008 à 18:49
Bonjour,

Je souhaite supprimer des sauts de lignes présents dans mon fichier .txt (3 milliions de lignes). Les sauts de lignes proviennent des "ALT+Entrée" fait dans des cellules excel.

Le but étant de lire ce fichier pour créer une table.

Quand j'utilise la fonction sed pour remplacer les retour chariots dos par retour chariot unix cela ne fonctionne pas.. Comme je ne connais pas bien UNIX... je ne sais pas quoi faire d'autres...

Si vous pouviez m'aider :)
A voir également:

14 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
24 nov. 2008 à 16:50
0
Merci de ta réponse mais c'est justement cette page que j'ai consulté et ce code que j'ai appliqué mais cela ne fonctionne pas. :(

Et par manque de connaissances je ne serais dire pourquoi..
Mais en tout cas quand je l'ouvre avec vi cela ne change rien.

quand j'ouvre mon fichier sous windows avec blocnote ou ultraedit:
champ1;champ2;champ3;champ4
ident01;blabla blabla blabla;10 ; blabla
ident02; ...

quand j'ouvre mon fichier sous unix :
champ1;champ2;champ3;champ4
indent01;blabla
blabla
blabla
10;blabla
indent02; ...
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
24 nov. 2008 à 17:24
Salut,
perl -pi.orig -e 's/\r//' ton_fichier
0
Merci mais encore une fois cela ne change rien ma chaine de caractères se décomposent.

Peut être qu'une simple instruction n'est suffisante et qu'il faut que je fasse un script en KSH afin de recréer mes lignes une à une.

J'ai quelques idées mais encore une fois mon manque de connaissances me bloque, connaissez vous un bon support afin que je trouve les instructions de base?
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
24 nov. 2008 à 17:52
Salut,

En fait on aura besoin d'un p'tit bout de ton fichier pour pouvoir tester.
head -10000 ton_fichier > fichier.test

Et mets le fichier.test sur cjoint.com
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
24 nov. 2008 à 18:04
Ou aussi sans passer par Cjoint, un bout du fichier avec :
head fichier | cat -A
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
24 nov. 2008 à 18:02
Sinon il y a aussi "dos2unix" qui te fait ça tout seul...
0
Les données étant confidentielles je ne peux pas vous donner le fichier même une partie.
Mais je peux vous en créer un fictif pour tester le problème et vous le mettre à dispo demain. Cela peut venir d'un autre caractère selon vous ?

Je vais re-tester dos2unix mais il me semble que cela ne marche pas non plus.

Merci pour votre aide.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
24 nov. 2008 à 18:14
Salut,

Mais je peux vous en créer un fictif pour tester le problème et vous le mettre à dispo demain.

Ok, ça sera parfait ;-)
0
Salut,

Le lien pour tester mon fichier, il est fictif mais reproduit mon pb.

https://www.cjoint.com/?lzj00AHhsv

Merci
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569 > Karen
25 nov. 2008 à 10:25
Salut,

Je ne pourrai regarder que ce soir.
Peut être que jipicy pourra regarder avant ;-))
0
Karen > lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019
25 nov. 2008 à 10:34
C'est déjà bien de m'apporter de l'aide je ne peux que dire merci même si tu ne regardes que ce soir.
Bien que j'espere trouver la solution par moi même dans l'aprés midi :p
Si c'est le cas j'expliquerais ma solution.
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
25 nov. 2008 à 10:40
Re,

Tape cette commande et affiche le résultat
perl -ne 's/(.)/ord($1)/egs;print "$_\n"' fichier.fictif
Merci.
0
Euh... ca me donne ca...


"67111100101326711110910911711010132826782658432583253504950493495148465250545210
48495356534955575148485050509485150535656515156559828569327165826932453278698573767689327632698669818569324053504193452321129710511410111532971173210911110511011532115111110116321001051151121111101059810810111510
679710810598114101321081111101031171011171143258324852484948484912410
826782658432583278698610
671111001013267111109109117110101328267826584325832535051525634949544653495310
"
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
25 nov. 2008 à 11:10
Ton exemple ne m'aide pas puisque je ne sais pas quelles lignes tu m'affiche.

Tape et mets sur cjoint.com le résultat (le fichier fictif.txt)
perl -ne 's/(.)/ord($1)/egs;print "$_\n"' fichier.fictif > fictif.txt

Le but de ma commande c'est de depister les caractès ASCII que je dois supprimer.
0
OK... je me disais aussi comment ca peut l'aider :s

https://www.cjoint.com/?lzlseIXA7Q
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
25 nov. 2008 à 13:30
Re-

Tu peux essayer ça s'il te plait et me dire si ça le fait ?
sed ':z;N;/^M$/!bz;s/\x0A/ /g' ton_fichier
;-)
0
Ca me renvoie ca

sed: The label :z;N;/^M$/!bz;s/\x0A/ /g is greater than eight characters.
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
25 nov. 2008 à 14:57
Quelle version de sed ? Quel système ?

Essaye comme ça alors :
sed '
:z
N
/^M/ !b z
s/\x0A/ /g
' ton_fichier
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
25 nov. 2008 à 16:41
Salut,

Ok, j'ai compris pourquoi
lami20j@debian:~/trash$ cat -t exemple_fichier.txt | head -10
IDENT^IAdresse du client^IConstruction de ligne^IAff_total^M
000001^ILISTE ROUGE^I"3 paire(s) disponible(s)
Calibre longueur : 0400385|
RCRAT : ABB
Code Commune RCRAT : 80001"^I7.275^M
000002^ILISTE ROUGE^I"3 paire(s) disponible(s)
Calibre longueur : 0400400|
RCRAT : ABB
Code Commune RCRAT : 80001"^I7.5^M
000003^ILISTE ROUGE^I"3 paire(s) disponible(s)
lami20j@debian:~/trash$


On remarque que entre les lignes qui se finissent avec CarriageReturn (^M) il y a des lignes qui se finissent avec \n.
En supprimant seulement ^M toutes les lignes restent inchangées.
A savoir qu'entre deux ^M il y a une seule ligne (les cellules y compris celles avec CarriageReturn Les sauts de lignes proviennent des "ALT+Entrée" fait dans des cellules excel. ).

Donc on doit d'abord supprimer (ou le remplacer avec un espace) le \n entre deux ^M et ensuite supprimer le ^M

Un exemple (les 20 premiers lignes)
lami20j@debian:~/trash$ perl -ne '!/\r/?s/\n//:s/\r//;print' exemple_fichier.txt | head -20
IDENT   Adresse du client       Construction de ligne   Aff_total
000001  LISTE ROUGE     "3 paire(s) disponible(s)Calibre longueur : 0400385|RCRAT : ABBCode Commune RCRAT : 80001"      7.275
000002  LISTE ROUGE     "3 paire(s) disponible(s)Calibre longueur : 0400400|RCRAT : ABBCode Commune RCRAT : 80001"      7.5
000003  LISTE ROUGE     "3 paire(s) disponible(s)Calibre longueur : 0400385|RCRAT : ABBCode Commune RCRAT : 80001"      7.275
000004  LISTE ROUGE     "4 paires au moins sont disponiblesCalibre longueur : 0400695|RCRAT : HESCode Commune RCRAT : 62447"    11.925
000005  LISTE ROUGE     "4 paires au moins sont disponiblesCalibre longueur : 0400695|RCRAT : HESCode Commune RCRAT : 62447"    11.925
000006  LISTE ROUGE     "3 paire(s) disponible(s)Calibre longueur : 0600880|0400135|RCRAT : FEQCode Commune RCRAT : 80308"      12.589
000007  LISTE ROUGE     "3 paire(s) disponible(s)Calibre longueur : 0601630|0401145|RCRAT : FEQCode Commune RCRAT : 80308"      35.464
000008  LISTE ROUGE     "4 paires au moins sont disponiblesCalibre longueur : 0603590|0400495|RCRAT : WOICode Commune RCRAT : 80827"    45.902
000009  LISTE ROUGE     "Il n'y a pas de paire disponible à l'adresseCalibre longueur : 0401268|RCRAT : ABBCode Commune RCRAT : 80001"  20.52
000010  LISTE ROUGE     "1 paire(s) disponible(s)Calibre longueur : 0602950|0402310|RCRAT : BUMCode Commune RCRAT : 80149"      66.535
000011  LISTE ROUGE     "1 paire(s) disponible(s)Calibre longueur : 0602950|0402310|RCRAT : BUMCode Commune RCRAT : 80149"      66.535
000012  LISTE ROUGE     "Il n'y a pas de paire disponible à l'adresseCalibre longueur : 0400345|RCRAT : ABBCode Commune RCRAT : 80001"  6.675
000013  LISTE ROUGE     "Il n'y a pas de paire disponible à l'adresseCalibre longueur : 0400345|RCRAT : ABBCode Commune RCRAT : 80001"  6.675
000014  LISTE ROUGE     "4 paires au moins sont disponiblesCalibre longueur : 0603523|RCRAT : ABBCode Commune RCRAT : 80001"    37.7869
000015  LISTE ROUGE     "3 paire(s) disponible(s)Calibre longueur : 0401230|RCRAT : ABBCode Commune RCRAT : 80001"      19.95
000016  LISTE ROUGE     "1 paire(s) disponible(s)Calibre longueur : 0606185|RCRAT : AULCode Commune RCRAT : 80039"      65.2055
000017  LISTE ROUGE     "Il n'y a pas de paire disponible à l'adresseCalibre longueur : 0403620|RCRAT : ABBCode Commune RCRAT : 80001"  55.8
000018  LISTE ROUGE     "Il n'y a pas de paire disponible à l'adresseCalibre longueur : 0403620|RCRAT : ABBCode Commune RCRAT : 80001"  55.8
000019  LISTE ROUGE     "Il n'y a pas de paire disponible à l'adresseCalibre longueur : 0403620|RCRAT : ABBCode Commune RCRAT : 80001"  55.8


A faire sur ton fichier (le fichier original aura l'extension .orig)
perl -pi.orig -e '!/\r/?s/\n//:s/\r//' exemple_fichier.txt



0
Merci pour votre aide et le temps passé sur mon pb.

Mais je vais demander qu'on me renvoie un ficher sans saut de ligne dans une cellule.

Ton code fonctionne mais tout se retrouve sur une seule ligne..

Bonne soirée.
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569 > Karen
25 nov. 2008 à 17:48
Re,

comment ça sur une seule ligne

Regarde, il y a 85 lignes sur ton exemple_fichier.txt
$  perl  -ne '!/\r/?s/\n//:s/\r//;print' exemple_fichier.txt | wc -l
85
0
Karen > lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019
25 nov. 2008 à 17:57
Ce que je veux dire c'est que à la base j'ai un fichier de x lignes et une fois la commande exécuter, le fichier contient 1 seule ligne.

Quand il y a peu de ligne c'est gérable mais mon fichier de base en contient 3 millions... alors ca génére un fichier impossible à ouvir.
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569 > Karen
25 nov. 2008 à 18:08
Re,

Ouvrir avec quoi?

Pour l'info j'ai traité des fichiers avec 68201421 lignes.
Pour moi 3 millions n'est pas grande chose.

Mais je ne suis pas sur d'avoir saisi ton but.
Bon, le fichier on le parse. Mais que veux tu faire avec le fichier que tu obtiendras.
Au début tu parles d'une table. Je pense que tu dois donner un peu plus de détails.
0
Karen > lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019
26 nov. 2008 à 10:01
Salut,

Dans la précipitation je me suis peut être mal exprimée.

Le fichier :
A la base j'ai un fichier TXT qui contient 3 millions de lignes et 5 colonnes.
Ce fichier a été construit à partir d'EXCEL, c'est une concaténation de plusieurs fichiers.
Dans la troisième colonne il y a des sauts de lignes, utilisation de ALT+ENTREE dans la cellule.

Mon environnement :
Je travail avec une base de données SAS dans un environnement Unix, j'y accède en utilisant EXCEED.

Mon taff :
Mon but est d'intégrer ce fichier dans ma base de données.

Mon PB :
Le fichier contient des sauts de lignes à l'intérieur d'une colonne qui font que lorsque j'importe ce fichier cette colonne se transforme en plusieurs nouvelles lignes (autant de lignes que de sauts de lignes présents dans la cellule…). Ce qui a pour impact de créer une table totalement fausse.

Ma solution "idéale" (non trouvée) :
Je dois retravailler mon fichier afin de supprimer (ou remplacer) ces sauts de lignes (ceux créer par ALT+ENTREE)
pour qu'une ligne de mon fichier corresponde à une ligne dans ma table.

Actuellement :
Les solutions que vous m'avez proposé, et je vous en remercie, supprime tous les sauts de lignes ce qui fait que je me retrouve avec un fichier contenant 1 ligne et donc inexploitable pour construire ma table.

Ma solution de contournement :
Je suis maintenant dans l'urgence donc je vais demander qu'on me renvoi un fichier déjà retravailler mais dans 1 mois je serais à nouveau confronter à ce problème donc si vous avez une solution elle sera la bienvenue.


J'espère avoir bien testé les codes que vous m'avez envoyés et avoir mieux exposé mon problème.


Merci de l'aide que vous m'avez apporté.
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
26 nov. 2008 à 10:08
Salut,

Je ne comprends toujours pas.
La solution que je t'ai donné ne génere pas un fichier avec une seule ligne (celle de jipicy non plus)

Tape cette commande sur ton fichier de 3 millions lignes et affiche le résultat
perl  -ne '!/\r/?s/\n//:s/\r//;print' fichier_3millions.txt | wc -l

0
Je suis désolée j'ai l'impression de vous faire perdre votre temps...
Je me retrouve bien avec un fichier contenant 1 seule ligne :((

$ perl -ne '!/\r/?s/\n//:s/\r//;print' Eligibilite_ADSL_T1_09_test.csv | wc -l
0
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
26 nov. 2008 à 10:30
Re,

Alors l'exemple de fichier fictif que tu m'as donnée n'est pas bon.
0
Le fichier de test envoyé contient des TAB comme séparateur mon fichier contient des ; ... est ce que cela peut venir de la?

Dans le doute je te remets un nouveau fichier à dispo.
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
26 nov. 2008 à 10:41
Re,

Dans le doute je te remets un nouveau fichier à dispo.

Il vaut mieux ;-)
C'est très important d'avoir le même environnement.
0
Karen > lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019
26 nov. 2008 à 10:55
J'ai ouvert le ficher d'origine dans ultra edit,
j'ai copié les premieres lignes,
modifié quelques données pour garder la confidentialité
et enregistré mon fichier exemple..


https://www.cjoint.com/?lAkX66nLGF

Merci de ta patience face à mon ignorance :)
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897 > Karen
26 nov. 2008 à 18:49
Tiens tu peux essayer ça sur ton fichier de test :
sed ':z;N;$! bz;s/\n[^"]//g' fichier_test
et voir si ça fait l'affaire...
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
26 nov. 2008 à 11:02
Re,

Justement, dans ton fichier que tu as envoyé dans la 3ème colonne il n'y a rien.
Tout est dans colonne A.
Envoi plutôt le fichier xls.
Tu perds déjà ta mise en page au moment d'enregistrement sous format .csv
0