Notepad , Modification en masse

Résolu
Jack80 - Modifié le 27 févr. 2024 à 04:02
 Jack80 - 2 mars 2024 à 12:07

Bonjour,
j'ai un fichier de l'ordre de 600 lignes de ce style:

75-azer-165-;;;;-btr-axt-12-15-;;;;-qft-
82-qtr-;;;;-18-;;;;-bst-fgt_;;;;85-;;;;-60-;;;;-
12-545-;;;;-ghu-rtb-;;;;-200-uti-;;;;-10-;;;;-82-;;;;-rta-;;;;-25
46-;;;;-pkt-;;;;-654-;;;;-dhe-25-

et avec Notepad++, je voudrais en le un minimum d'exécutions remplacer les ;;;; par les 2 premiers caractères de chaque ligne :

  • sur la 1ère ligne, les ;;;; seraient remplacés par 75,
  • sur la 2ème ligne, les ;;;; seraient remplacés par 82,
  • sur la 3ème ligne, les ;;;; seraient remplacés par 12,

Est-ce possible ? Sur certaines lignes j'ai de l'ordre de 70 groupes de ;;;;.

Actuellement, j'arrive à modifier le premier ou le dernier groupe de ;;;; de chaque ligne, mais pas l'ensemble d'une seule fois.

Merci pour votre retour
Windows / Chrome 122.0.0.0

A voir également:

5 réponses

mamiemando Messages postés 33381 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 26 novembre 2024 7 802
27 févr. 2024 à 04:12

Bonjour,

Je ne connais pas assez notepad++ pour te dire si c'est possible ou non, mais à moins de faire une opération de substitution pour chaque ligne, je ne pense pas que ce soit possible.

Le plus simple serait sans doute d'écrire un petit script, dans le langage de ton choix (par exemple en awk, en python, ...), et faire une substitution pouvant s'appliquer plusieurs fois sur la ligne courante (en awk, fonction s'appelle dans beaucoup de langages de programmation gsub ; en python, on utiliserait la méthode replace ou une expression régulière).

Voici à quoi ça ressemblerait en python :

toto.py

import sys

filename_input = sys.argv[1]
filename_output = sys.argv[2]
with open(filename_input, "r") as f_in:
    with open(filename_output, "w") as f_out:
        for line in f_in.readlines():
            substitut = line[:2]
            line = line.strip().replace(";;;;", substitut)
            print(line, file=f_out)

Utilisation :

python toto.py filename_in.csv filename_out.csv

Résultat (contenu dans filename_out.csv) :

75-azer-165-75-btr-axt-12-15-75-qft-
82-qtr-82-18-82-bst-fgt_8285-82-60-82-
12-545-12-ghu-rtb-12-200-uti-12-10-12-82-12-rta-12-25
46-46-pkt-46-654-46-dhe-25-

Bonne chance

2
hypothetix Messages postés 197 Date d'inscription dimanche 19 janvier 2020 Statut Membre Dernière intervention 24 octobre 2024 55
Modifié le 27 févr. 2024 à 13:47

Bonjour,

Pour faire simple dans Notepad++ on peut:

Rechercher: ^([0-9][0-9])(.*);;;;
Remplacer par: $1$2$1


Cocher Boucler et Expression régulière

Et faire Remplacer tout autant de fois que ;;;; est contenu le + grand nombre de fois dans une ligne.
Ici 6 fois puisque la ligne 3 contient 6 fois ;;;;


1

j'ai résolu en lançant le "remplacer tout" autant de fois que nécessaire  pour arriver à 0 mise à jour.

Merci à vous tous pour vos conseils.

1

On peut utiliser les expressions régulières directement en Notepad++. J'espère que le lien suivant te sera utile:

https://nliautaud.developpez.com/tutoriels/web/notepadplusplus-guide-pratique/expressions-regulieres/

0

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

Posez votre question
blux Messages postés 26491 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 25 novembre 2024 3 316
27 févr. 2024 à 09:13

Salut,

il faudrait dans ce cas utiliser les références de mémoire des expressions régulières.

J'ai eu fait un truc comme ça il y a très longtemps mais je ne souviens plus où je l'ai mis...


0
mamiemando Messages postés 33381 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 26 novembre 2024 7 802
27 févr. 2024 à 12:58

Peut-être en s'inspirant de ceci. En tout cas, il faudra recourir à des opérateurs non standards des expressions régulières (en admettant que ce soit faisable).

0
blux Messages postés 26491 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 25 novembre 2024 3 316 > mamiemando Messages postés 33381 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 26 novembre 2024
27 févr. 2024 à 13:49

Le souci des références de mémoire est que ça ne marche que sur une seule ligne de regex, or dans notepad, on est sur 2 lignes : rechercher, remplacer sans que les deux ne soient liées.

0
mamiemando Messages postés 33381 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 26 novembre 2024 7 802 > blux Messages postés 26491 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 25 novembre 2024
27 févr. 2024 à 14:42

Oui, à moins qu'un opérateur non standard le permette, je ne vois pas trop comment tu peux t'en sortir avec juste une expression rationnelle. Car tu peux effectivement en une expression régulière :

  • faire un remplacement de masse
    • par exemple, sed -i 's/;/!/g' permet de changer tous les ';' en '!') ;
  • faire une back reference à une partie de la chaîne de départ pour reconstruire la chaine d'arrivée
    • par exemple, sed -i 's/\(..\).*/!\1!/g' permet d'extraire les deux premiers caractères de la chaîne d'entrée (disons 75), puis d'écrire ces deux caractères entre deux points d'exclamation, mais cela suppose de savoir exactement comment réinjecter cette référence dans la chaîne de sortie (ici !75!)
  • mais je ne vois pas comment tu peux faire les deux à la fois, car il peut y avoir un nombre arbitraire de ";;;;" à substituer.

Après, il y a des utilisations de sed avancées (voir par exemple ici), mais :

  • il n'est pas certain que ça résoudrait le problème,
  • il n'est pas garanti que Notepad++ soit capable de supporter plusieurs opérations en une (comme c'est fait dans le lien précédent)
  • il est sans doute aussi plus compliqué de trouver comment l'écrire avec une expression régulière tordue que d'écrire un petit script python ou awk

A contrario, il est assez simple d'installer python ou d'utiliser un interpréteur en ligne python (par exemple replit) quitte à adapter un peu le script #1 pour qu'il lise une chaîne de caractère (les fameuses 600 lignes) et écrive le résultat sur la sortie standard.

data = """
75-azer-165-;;;;-btr-axt-12-15-;;;;-qft-
82-qtr-;;;;-18-;;;;-bst-fgt_;;;;85-;;;;-60-;;;;-
12-545-;;;;-ghu-rtb-;;;;-200-uti-;;;;-10-;;;;-82-;;;;-rta-;;;;-25
46-;;;;-pkt-;;;;-654-;;;;-dhe-25-
"""

for line in data.splitlines():
    if line:
        substitut = line[:2]
        line = line.replace(";;;;", substitut)
        print(line)

Bonne chance

0
Jack80 > mamiemando Messages postés 33381 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 26 novembre 2024
27 févr. 2024 à 17:40

Merci Mamiemando pour cet exemple

0
mamiemando Messages postés 33381 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 26 novembre 2024 7 802 > Jack80
29 févr. 2024 à 15:04

Est-ce que ton problème est résolu ?

0