Raccourcissement de longues lignes

Visiteur
Visiteur
Je souhaite raccourcir les longues lignes d'un fichier texte. Une ligne doit contenir au maximum 413 caractères. Je dois donc insérer des sauts de ligne. Le texte est une fiction (livre).
Conseillez-moi un code python ou bash.
Édité par Visiteur Le 17/04/2024 à 06h03

Jybz Membre non connecté
-
- Voir le profil du membre Jybz
- Inscrit le : 10/10/2018
- Groupes :
-
Administrateur
-
Forgeron
Code BASH :
sed -E 's/(.{413})/\1\n/g' ./text-original >./copie-tronquee
Téléverser une image : /wiki/hebergement-de-fichiers-sur-mlo
Arch | Machine | OS |
x86_64 | lenovo x250 | mga9 |
armv7hl | bananapro | mga9 |
aarch64 | Raspberry Pi 4B | mga9 |

Jybz Membre non connecté
-
- Voir le profil du membre Jybz
- Inscrit le : 10/10/2018
- Groupes :
-
Administrateur
-
Forgeron
Code BASH :
sed -E 's/(.{393,413}) /\1\n/g' <./text-original >./copie-tronquee
Téléverser une image : /wiki/hebergement-de-fichiers-sur-mlo
Arch | Machine | OS |
x86_64 | lenovo x250 | mga9 |
armv7hl | bananapro | mga9 |
aarch64 | Raspberry Pi 4B | mga9 |

Visiteur
Visiteur

Jybz Membre non connecté
-
- Voir le profil du membre Jybz
- Inscrit le : 10/10/2018
- Groupes :
-
Administrateur
-
Forgeron
Que donnes :
Code BASH :
sed -E 's/(.{353,412}[,\.!\?;])/\1\n/g' <./text-original | sed -E 's/(.{393,413}) /\1\n/g' >./copie-tronquee
Au premier sed on cherche entre 353 et 412 caractères quelconque suivit d'une ponctuation, on remplace par lui même en ajoutant un \n et on continue la ligne (g). Le second sed coupe les lignes qui sont toujours trop longues (au cas où de 353 à 412 il n'y avait aucune ponctuation).
Téléverser une image : /wiki/hebergement-de-fichiers-sur-mlo
Arch | Machine | OS |
x86_64 | lenovo x250 | mga9 |
armv7hl | bananapro | mga9 |
aarch64 | Raspberry Pi 4B | mga9 |

Visiteur
Visiteur
input.txt
output.txt
Code :
Название комната получила ...
пройти.
Je constate que dans ce cas, seul un mot est reporté à la ligne suivante, même si, sans la correction, le nombre de caractères serait inférieur à 413.
Édité par Visiteur Le 18/04/2024 à 06h57

Visiteur
Visiteur
Édité par Visiteur Le 18/04/2024 à 14h43

Jybz Membre non connecté
-
- Voir le profil du membre Jybz
- Inscrit le : 10/10/2018
- Groupes :
-
Administrateur
-
Forgeron
Téléverser une image : /wiki/hebergement-de-fichiers-sur-mlo
Arch | Machine | OS |
x86_64 | lenovo x250 | mga9 |
armv7hl | bananapro | mga9 |
aarch64 | Raspberry Pi 4B | mga9 |

Visiteur
Visiteur
https://stackoverflow.com/questions/34595373/make-auto-line-breaks-in-a-long-text-take-care-of-sentences
Citation :A sentence should not be broken. Only line break after dots.
C'est ce que je veux.
Et la différence, c'est que php a des mots, alors que j'ai besoin de caractères (413).
Édité par Visiteur Le 19/04/2024 à 11h36

Jybz Membre non connecté
-
- Voir le profil du membre Jybz
- Inscrit le : 10/10/2018
- Groupes :
-
Administrateur
-
Forgeron
Non testé :
Code BASH :
sed -E '/.{413}.+/s/(.{353,412}[,\.!\?;])/\1\n/g' <./text-original | sed -E '/.{413}.+/s/(.{393,413}) /\1\n/g' >./copie-tronquee
Il y a encore un bug. Je ne sais pas "revenir en arrière" depuis le 413e caractère.
On devrait enrober les script sed dans une boucle et ne pas utiliser l'option globale g.
Téléverser une image : /wiki/hebergement-de-fichiers-sur-mlo
Arch | Machine | OS |
x86_64 | lenovo x250 | mga9 |
armv7hl | bananapro | mga9 |
aarch64 | Raspberry Pi 4B | mga9 |

Papoteur Membre non connecté
-
- Voir le profil du membre Papoteur
- Inscrit le : 03/10/2011
- Groupes :
-
Modérateur
-
Équipe Mageia
-
Administrateur
-
Forgeron
Voici ma proposition en Python
Code PYTHON :
import textwrap with open("input.txt", "r") as f: output = "" for l in f.readlines(): # text splited by lines output = "\n".join([output, textwrap.fill(l, width=413)]) # adding to the output the wrapped new line with open("output.txt", "w") as o: o.write(output)
Yves

Visiteur
Visiteur
Ce code fonctionne mieux.
Peux-tu faire des sauts de ligne seulement après les "points, ? et !" et pas après les virgules ?
Parce que le texte est envoyé au convertisseur text-to-speech, qui travaille avec lines (il ne connaît pas le contenu des lignes précédentes et suivantes). C'est pourquoi je veux conserver le sentences. Sinon, le son ne sera pas naturel.
Les sauts de ligne après les virgules ne sont pas si mal, cependant. Mais pas très bon.
Papoteur
Ton code fonctionne, mais il casse les phrases (sentences), malheureusement.

Visiteur
Visiteur
1. Vérifier le nombre de caractères de la ligne
2. S'il y a plus de 413 caractères, revenir au point (ou ? ! optional mais pas ,) le plus proche à gauche et insérer un saut de ligne après celui-ci.

Papoteur Membre non connecté
-
- Voir le profil du membre Papoteur
- Inscrit le : 03/10/2011
- Groupes :
-
Modérateur
-
Équipe Mageia
-
Administrateur
-
Forgeron
Code PYTHON :
from nltk.tokenize.punkt import PunktSentenceTokenizer import textwrap pst = PunktSentenceTokenizer() with open("input.txt", "r") as f: output = "" for l in f.readlines(): chunk = "" sentences = pst.tokenize(l) for sentence in sentences: output = "\n".join([output, textwrap.fill(sentence, width=413)]) with open("output.txt", "w") as o: o.write(output)
J'ai mis une phrase par ligne. Ce n'est pas ce qui est demandé, je sais, mais peut-être que ça convient.
Yves
-
- Voir le profil du membre Eric David Petit
- Inscrit le : 01/01/2020
- Groupes :
-
Forgeron
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie