2009-08-07 7 views
0

Je suis en train de nettoyer des blocs de texte relativement grands (30 lignes). Voici un extrait:Manière optimale de remplacer les caractères dans une grande chaîne avec Python?

PID | 1 || 06225401 ^^^ PA0^MR || PATIENT^FAKE R ||| F

PV1 | 1 | Je ||||| 025631^DoctorZ ^^^^^^^ PA0 ^^^^ DRH | |||| ... DRH

ORC | RE || CYT-09-06645^AP |||||| 200912110333 | INTERFACE07

OBR | 1 || CYT09-06645 | 8104 ^^ L ||| 20090602 ||||||| 200906030000 [conditio ...

OBX | 1 | TX | 8104 | 1 | SOURCE DE S PECIMEN: [source] |||||| F ||| 200912110333 | CYT ...

J'ai actuellement un script qui prend des caractères illégaux ou des termes. Voici un exemple. Mon but est de modifier ce script afin que je puisse ajouter 4 chiffres à la fin de l'un des champs. En particulier, le champ de date ("20090602") dans la ligne OBR. Le script terminé sera capable de fonctionner avec n'importe quel fichier qui suit ce même format. Est-ce possible avec la façon dont je gère actuellement l'entrée de fichier ou dois-je utiliser une logique différente?

+0

La question n'est pas complètement claire. Pouvez-vous fournir des exemples d'entrée et de sortie? –

+1

Ces en-têtes indésirables peuvent être mieux exprimés par exemple. "4 \ xfePATH \ xfe" pour montrer clairement que les soi-disant "caractères illégaux" ne sont pas des caractères (ni épines minuscules islandaises, ni minuscules latines p (à quoi elles ressemblent à première vue)) mais juste binaires ordures. –

Répondre

2

Voici un aperçu (non testé) ... En gros, vous faites une ligne à la fois

for line in infile: 
    data = line.rstrip("\n").split("|") 
    kind = data[0] 
    # start of changes 
    if kind == "OBR": 
     data[7] += "0000" # check that 7 is correct! 
    # end of changes 
    outrecord = "|".join(data) 
    outfile.write(outrecord + "\n") 

qui précède suppose que vous sélectionnez des cibles de fix-up par ligne de type (exemple: "OBR") et l'index des colonnes (exemple: 7). S'il n'y a que peu de telles cibles, ajoutez simplement d'autres instructions de correction similaires. S'il y a beaucoup de cibles, vous pouvez les spécifier comme ceci:

fix_targets = { 
    "OBR": [7], 
    "XYZ": [1, 42], 
    } 

et le code fix_up ressemblerait à ceci:

if kind in fix_targets: 
    for col_index in fix_targets[kind]: 
     data[col_index] += "0000" 

Vous pouvez, comme dans tous les cas pour ajouter du code pour vérifier que les données [ col_index] est vraiment une date au format AAAAMMJJ avant de la changer.

Aucune des réponses ci-dessus n'élimine les en-têtes indésirables, car vous n'avez pas montré de données d'exemple. Je deviner que l'application de vos remplacements à chaque ligne (et en évitant d'écrire la ligne si elle est devenue seulement l'espace après les remplacements) ferait l'affaire.

+0

Parfait. Je me suis dit que c'était peut-être quelque chose comme ça, mais je ne pouvais pas vraiment le visualiser. Merci d'avoir répondu. – Sean

+1

Bien. fichier sortant.write (outrecord + '\ n') a un équivalent Python: print >> outfile, outrecord, ce qui est plus simple. – EOL

+1

@EOL - sauf que la syntaxe "print chevron", peu utilisée, est également déconseillée. – JimB

Questions connexes