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'
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.
Parce qu'aucun fichier "in4799" ne se trouve à cet emplacement ?
Dans ton message d'origine tu indiquais que le fichier était "in_4799" et pas "in4799" comme tu l'as écrit.
Vérifie aussi s'il n'y a pas d'extension . Tu es visiblement sous Windows, et ce système d'exploitation aime bien "simplifier la vie" des utilisateurs en masquant les extensions "connues" dans le gestionnaire de fichiers. Si ton fichier a une extension .txt et que tu ne pas précises pas dans ton programme, Python ne le trouvera pas.
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 ?
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.
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
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).
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 ?
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.
Pour mettre ce contenu dans un fichier, tu peux ouvrir un fichier en écriture que tu appelles, par exemple et écrire dedans ce qui est actuellement affiché à l'écran.
(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 sur et en effaçant le fichier temporaire ...
Le code deviendrait :
(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 ). Inspire toi de ce post sur SO : https://stackoverflow.com/questions/3964681/find-all-files-in-a-directory-with-extension-txt-in-python