Programme qui ne laisse qu'un seul mot par ligne [Résolu]

Signaler
Messages postés
283
Date d'inscription
dimanche 6 novembre 2005
Statut
Membre
Dernière intervention
21 décembre 2019
-
[Dal]
Messages postés
5379
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
27 janvier 2020
-
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

1 réponse

Messages postés
5379
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
27 janvier 2020
850
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
artagon7
Messages postés
283
Date d'inscription
dimanche 6 novembre 2005
Statut
Membre
Dernière intervention
21 décembre 2019
6
Merci Dal,

Je vais écrire quelque chose avec ce que tu as expliqué.
artagon7
Messages postés
283
Date d'inscription
dimanche 6 novembre 2005
Statut
Membre
Dernière intervention
21 décembre 2019
6
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
[Dal]
Messages postés
5379
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
27 janvier 2020
850
Bravo !