2016-03-29 13 views
-4

Es gibt eine Liste der Ersetzungen (http://pastebin.com/JH932Qxi) und Liste, die ersetzt werden muss (http://pastebin.com/RSwdWiKy). Regeln für Ersatz:Ersetzen mehrerer Wörter durch Liste - Duplikate Erstellung

S1000005 = S1000005,S1000006,S1000010 
S1000007 = S1000007,S1000008 
S1000009 = S1000009 
S2000005 = S2000005,S2000006,S2000007,S2000008 
S2000009 = S2000009,S2000010 
S3000005 = S3000005,S3000010 
S3000006 = S3000006,S3000008 
S3000007 = S3000007,S3000009 

Eingangsleitungen:

S1000005 S2000005 S3000005 
S1000006 S2000006 S3000006 
S1000007 S2000007 S3000007 
S1000008 S2000008 S3000008 
S1000009 S2000009 S3000009 
S1000010 S2000010 S3000010 

Ergebnis wie diese http://pastebin.com/8BkRFC87 sein sollte.

Beispiel Ausgabe:

S1000005 S2000005 S3000005 
S1000005 S2000005 S3000006 
S1000007 S2000005 S3000007 
S1000007 S2000005 S3000006 
S1000009 S2000009 S3000007 
S1000005 S2000009 S3000005 

ich diese mit Notepad ++ getan haben (es Zeit viel gespeichert), aber es ist möglich, vollautomatisiert zu machen. (Zuerst mache ich das Aufteilen auf die Linien, als das Ersetzen der Lesezeichenzeile und das Zurücksetzen von 3 Spalten).

Wie liest man die Liste der Ersetzungen, um das Ersatzmissbrauch zu erstellen? Und wie man Wörterbuch benutzt, um Listen der Duplikate durch Ersatz zu bilden?

Oder gibt es einen Texteditor, der "S1000005, S1000006, S1000010, S1000011, S1000022, S1000023, S1000024, S1000025, S1000056" suchen und durch "S1000005" ersetzen kann?

+4

Bitte zeigen Sie, was Sie versucht haben, und erklären, was nicht funktioniert hat. Erstellen Sie ein kleines Beispiel für das, was Sie benötigen, ohne alle externen Links. – ChrisP

+1

Welche Sprache möchten Sie verwenden? Sie würden niemals eine Mischung aus Python und Tcl für diese Art von Dingen verwenden; das wäre absurd verwickelt! –

+0

@DonalFellows Ich bevorzuge Python oder TCL. – XuMuK

Antwort

1

die Dictionnary Erhalten {ersetzt werden: Ersatz} aus der ersten Datei:

replace = {} 
with open('input1') as fd: 
    for line in fd: 
     head, tail = line.split('=') 
     for idt in tail.split(','): 
      replace[idt] = head 

Schreib in output den Inhalt der zweiten Datei input2, mit Ersatz:

with open('input2') as ifd, open('output', 'w') as ofd: 
    for line in ifd: 
     ofd.write(' '.join(replace.get(idt, idt) for idt in line.split())) 

, hier die dict.get Methode wird verwendet, um die Kennung Ersatz zu nehmen, oder die Kennung selbst, wenn sie nicht im Wörterbuch vorhanden ist.

Im vim Texteditor für die Regex S1000005,S1000006,S1000010,S1000011,S1000022,S1000023,S1000024,S1000025,S1000056 durch S1000005 ersetzen ist:

%s/S1000005\|S1000006\|S1000010\|S1000011\|S1000022\|S1000023\|S1000024\|S1000025\|S1000056/S1000005/g 

Unter anderen Text-Editoren, einige Zeichen könnte eine Flucht \ benötigen. Hängt von der verwendeten Regex-Engine ab. Andere Regex-Engine konnte dieses annehmen:

s/{S1000005,S1000006,S1000010,S1000011,S1000022,S1000023,S1000024,S1000025,S1000056}/S1000005/g 
+0

Substitution in vim Editor ist eine schnelle und elegante Lösung. Aber ich werde versuchen, Python-Code zum Laufen zu bringen. – XuMuK

+0

Die Verwendung dieses Codes erzeugt zwei Arten von Fehlern: TypeError: erwartet ein Zeichen-Puffer-Objekt (Pythin 2.7) und TypeError: write() Argument muss str sein, nicht Generator (3.5). – XuMuK

+0

Entschuldigung für den Tippfehler, ich habe das '.join' vergessen. Jetzt behoben. – aluriak

Verwandte Themen