Supprimer ": :" dans un document.txt

Signaler
-
[Dal]
Messages postés
5375
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
17 janvier 2020
-
Bonjour,
j'ai un ficher in_4799 , et je voudrais faire un script en C pour supprimer automatiquement quand il y a "::" qui suit un + quand la ligne commence par PCI.

Voici a quoi ressemble le ficher in_4799 :

PCI+24+AS PER INVOICE::CONTAINER NO.?::GLDU9388840::AGENT SEAL NO.?::IN0344370::CUSTOM SEAL NO.:?:2222486'
PCI+24+::CONTAINER NO.?:2::FCIU4781107 /:20 FT:::AGENT SEAL NO.?::IN0423237'
PCI+24+:CUSTOM SEAL NO.:?:2222485'
CST+1+T:120+T2:105++732599:169'
GID+6+1:PK'
FTX+AAA+++ALUMINIUM PNEUMATIC MECHANICAL PART'
MEA+AAE+G+KGM:226'
MEA+AAE+AAW+MTQ:37.351'
SGP+GLDU9388840+1'
PCI+24+AS PER INVOICE::CONTAINER NO.?::GLDU9388840::AGENT SEAL NO.?::IN0344370::CUSTOM SEAL NO.:?:2222486'
PCI+24+::CONTAINER NO.?:2::FCIU4781107 /:20 FT:::AGENT SEAL NO.?::IN0423237'
PCI+24+:CUSTOM SEAL NO.:?:2222485'
CST+1+T:120+T2:105++841290:169'
GID+7+5:PK'
FTX+AAA+++DUCTILE IRON CAST ARTICLES'
MEA+AAE+G+KGM:2346.6'
MEA+AAE+AAW+MTQ:37.351'
SGP+GLDU9388840+5'
PCI+24+AS PER INVOICE::CONTAINER NO.?::GLDU9388840::AGENT SEAL NO.?::IN0344370::CUSTOM SEAL NO.:?:2222486'
PCI+24+::CONTAINER NO.?:2::FCIU4781107 /:20 FT:::AGENT SEAL NO.?::IN0423237'
PCI+24+:CUSTOM SEAL NO.:?:2222485'

Après le script le fichier devrait ressembler a ça :

PCI+24+AS PER INVOICE::CONTAINER NO.?::GLDU9388840::AGENT SEAL NO.?::IN0344370::CUSTOM SEAL NO.:?:2222486'
PCI+24+CONTAINER NO.?:2::FCIU4781107 /:20 FT:::AGENT SEAL NO.?::IN0423237'
PCI+24+:CUSTOM SEAL NO.:?:2222485'
CST+1+T:120+T2:105++732599:169'
GID+6+1:PK'
FTX+AAA+++ALUMINIUM PNEUMATIC MECHANICAL PART'
MEA+AAE+G+KGM:226'
MEA+AAE+AAW+MTQ:37.351'
SGP+GLDU9388840+1'
PCI+24+AS PER INVOICE::CONTAINER NO.?::GLDU9388840::AGENT SEAL NO.?::IN0344370::CUSTOM SEAL NO.:?:2222486'
PCI+24+CONTAINER NO.?:2::FCIU4781107 /:20 FT:::AGENT SEAL NO.?::IN0423237'
PCI+24+:CUSTOM SEAL NO.:?:2222485'
CST+1+T:120+T2:105++841290:169'
GID+7+5:PK'
FTX+AAA+++DUCTILE IRON CAST ARTICLES'
MEA+AAE+G+KGM:2346.6'
MEA+AAE+AAW+MTQ:37.351'
SGP+GLDU9388840+5'
PCI+24+AS PER INVOICE::CONTAINER NO.?::GLDU9388840::AGENT SEAL NO.?::IN0344370::CUSTOM SEAL NO.:?:2222486'
PCI+24+CONTAINER NO.?:2::FCIU4781107 /:20 FT:::AGENT SEAL NO.?::IN0423237'
PCI+24+:CUSTOM SEAL NO.:?:2222485'

merci d'avance.

2 réponses

Messages postés
5375
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
17 janvier 2020
849
En Python3, cela donnerait :

import re
  
f = open('in_4799')
for line in f:
    m = re.match(r"(^PCI.*?\+)::(.*$)", line)
    if m:
        print(m.group(1)+m.group(2))
    else:
        print(line, end='')
f.close()

Si
+::
peut apparaître plusieurs fois sur une ligne commençant par PCI, il faut modifier le code pour appliquer la regexp sur la ligne lue tant que la regexp est matchée (ce n'est pas le cas dans le jeu de données que tu fournis).

En C il faudrait une bonne centaine de lignes, sauf si tu utilises une bibliothèque gérant les regexp.

Dal
Jillow
Messages postés
8
Date d'inscription
mardi 14 janvier 2020
Statut
Membre
Dernière intervention
16 janvier 2020
> [Dal]
Messages postés
5375
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
17 janvier 2020

D'accord je vais essayer mettre l'extension et le "_" c'est juste que je l'ai oublier ????
[Dal]
Messages postés
5375
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
17 janvier 2020
849 > Jillow
Messages postés
8
Date d'inscription
mardi 14 janvier 2020
Statut
Membre
Dernière intervention
16 janvier 2020

c'est toi qui vois (tu peux voir ce que tu as), je me contente d'essayer de deviner et je ne peux pas voir à ta place :-)
Jillow
Messages postés
8
Date d'inscription
mardi 14 janvier 2020
Statut
Membre
Dernière intervention
16 janvier 2020
> [Dal]
Messages postés
5375
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
17 janvier 2020

ok c'est bon ça marche merci infiniment.

juste comme ça si je devais modifier le code pour que quand il y a un "+" il n'y ai pas de ":" derrière et redonner un nouveau fichier texte avec le contenu modifier par le programme je devrais faire quoi ?
Jillow
Messages postés
8
Date d'inscription
mardi 14 janvier 2020
Statut
Membre
Dernière intervention
16 janvier 2020
> [Dal]
Messages postés
5375
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
17 janvier 2020

OK merci infiniment pour ton aide.

Peut tu juste me dire ce que je dois faire pour que après les + il ai pas de : derrière et puis ensuite crée un nouveau document texte pour mettre le texte in_4799 traité par le code.
[Dal]
Messages postés
5375
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
17 janvier 2020
849 > Jillow
Messages postés
8
Date d'inscription
mardi 14 janvier 2020
Statut
Membre
Dernière intervention
16 janvier 2020

Le code actuel lit le fichier, effectue des tests sur chaque ligne, et retire un "::" précédé de + dans les lignes commençant par PRI et affiche le contenu à l'écran avec les instructions print en lignes 7 et 9.

Pour mettre ce contenu dans un fichier, tu peux ouvrir un fichier en écriture que tu appelles, par exemple
in_4799_mod
et écrire dedans ce qui est actuellement affiché à l'écran.

import re
  
f = open('in_4799')
modf = open("in_4799_mod", "w")

for line in f:
    m = re.match(r"(^PCI.*?\+)::(.*$)", line)
    if m:
        modf.write(m.group(1)+m.group(2))
    else:
        modf.write(line, end='')
f.close()
modf.close()

(non testé)

Si tu es satisfait du résultat, tu peux faire en sorte que ton code écrase le fichier d'origine, en copiant le fichier
in_4799_mod
sur
in_4799
et en effaçant le fichier temporaire
in_4799_mod
...

Le code deviendrait :

import re
import shutil
import os
  
f = open('in_4799')
modf = open("in_4799_mod", "w")

for line in f:
    m = re.match(r"(^PCI.*?\+)::(.*$)", line)
    if m:
        modf.write(m.group(1)+m.group(2))
    else:
        modf.write(line, end='')
f.close()
modf.close()

shutil.copyfile("in_4799_mod", "in_4799")
os.remove("in_4799_mod")

(non testé)

Une autre possibilité est de laisser le code tel que je l'ai posté affichant le résultat à l'écran et de rediriger la sortie écran en ligne de commande sur le fichier temporaire, puis faire la copie et retrait du fichier en ligne de commande.

Si tu as beaucoup de fichiers à traiter, tu voudras peut-être aussi que ton programme trouve tous ces fichiers et les traite tout seul, au lieu de coder le nom du fichier en dur.

Pour cela, tu peux utiliser le module glob si tu as un moyen de les sélectionner (par exemple s'ils commencent tous par
in_
). Inspire toi de ce post sur SO : https://stackoverflow.com/questions/3964681/find-all-files-in-a-directory-with-extension-txt-in-python
Messages postés
5375
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
17 janvier 2020
849
Bonjour Jillow,

Il est possible de le faire en C, mais utiliser un langage de script comme Perl permettrait de le faire en moins de 5 lignes de code (ou en Python en un peu plus).

Pourquoi veux-tu le faire en C ?

Dal
Jillow
Messages postés
8
Date d'inscription
mardi 14 janvier 2020
Statut
Membre
Dernière intervention
16 janvier 2020

Parce que j'ai quelques bases en C mets le python me conviendrait parfaitement.