Programme qui ne laisse qu'un seul mot par ligne

Résolu/Fermé
artagon7 Messages postés 415 Date d'inscription dimanche 6 novembre 2005 Statut Membre Dernière intervention 11 février 2024 - 9 déc. 2019 à 18:16
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 - 11 déc. 2019 à 19:14
Bonjour,

Je travaille avec des fichiers de format texte (UTF-8) qui contiennent, pour la moitié des lignes environ, un seul mot par ligne.
Pour les autres lignes, j’ai ajouté des lettres ou des annotations à la fin.
Aussi, je me suis aperçu, que certaines lignes contiennent un ou deux espacements à la fin.

Je voudrais simplement obtenir un fichier qui ne contienne :

1) qu’un seul mot (le premier) par ligne;
2) et sans espacement à la fin des lignes.

Voici un exemple :

Fichier d’entrée

bateau*
belle
bicyclette N
bien adverbe adj N
bord**

Note : L’astérisque indique, ici, un espacement en fin de ligne.

Fichier de sortie

bateau
belle
bicyclette
bien
bord

Si les fichiers ne comportaient qu’une dizaine de lignes, je le ferais à la main mais ils peuvent contenir plus de 1000 lignes.

Merci
A voir également:

1 réponse

[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié le 10 déc. 2019 à 10:40
Bonjour artagon7,

Pour chaque ligne, la regexp
/^([^\s]+)/
va capturer en
$1
:
  • à partir du début de la ligne
  • un ou plusieurs caractères
  • jusqu'à ce qu'elle rencontre un caractère "blanc" (non inclus)


Les caractères "blancs" sont non seulement les espaces, mais aussi les tabulations et retours à la ligne.

Donc pour générer le fichier de sortie, tu enverras vers le fichier modifié
"$1\n"
pour rajouter le retour à la ligne, puisqu'il ne sera pas capturé par la regexp.

Si tu es sous Linux, au lieu de faire cela avec Perl, tu peux faire aussi cela en ligne de commande avec GNU
sed
et l'option
-i
pour modifier le fichier "sur place" ("i" pour "in place") sans avoir à créer un fichier temporaire.

Autrement, personnellement, je fais ce genre de manipulations avec l'éditeur
vim
quant il n'y a pas trop de fichiers à traiter.


Dal
1
artagon7 Messages postés 415 Date d'inscription dimanche 6 novembre 2005 Statut Membre Dernière intervention 11 février 2024 7
10 déc. 2019 à 20:41
Merci Dal,

Je vais écrire quelque chose avec ce que tu as expliqué.
0
artagon7 Messages postés 415 Date d'inscription dimanche 6 novembre 2005 Statut Membre Dernière intervention 11 février 2024 7
11 déc. 2019 à 18:46
Salut Dal,

J'ai écrit le programme Perl ci-dessous et ça a fonctionné.

#  Programme un_mot_par_ligne.pl

#  Programme qui enlève, à chacune des lignes, tous les caractères après  
#  le premier mot. Cela inclut les espacements.
#  Il nécessite, en entrée, le fichier entree.txt.


#!/usr/bin/perl

use strict;
use warnings;

open(FICHIER_ENTREE, "entree.txt") or die "Le fichier ne s'ouvre pas: $!";
open(FICHIER_SORTIE, ">sortie.txt") or die "Le fichier ne s'ouvre pas: $!";

while(<FICHIER_ENTREE>)
{
/^([^\s]+)/;
print FICHIER_SORTIE "$1\n"
}

close FICHIER_ENTREE;
close FICHIER_SORTIE;


Je préfère l'écrire en Perl car dans mon vrai programme, il y aura ouverture de plusieurs fichiers pour une seule exécution du programme.

Quand je vais avoir du temps, je vais essayer avec sed. Je suis curieux de voir la procédure. J'ai déjà utilisé sed dans le passé.

Merci beaucoup
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
11 déc. 2019 à 19:14
Bravo !
0