Seite 1 von 1

String Manipulation + Konkatenation

Verfasst: Mittwoch 22. Juni 2005, 14:01
von chronical_chaos
Hallo NG,

Ich übertrage von einem Microcontroller via RS-232 Daten an einen PC.
Die übertragenen Daten werden von einem Python Progrämmsche eingelesen und abgespeichert.
Vor dem abspeichern möchte ich den String in dem die Daten eingelesen wurden noch etwas "bearbeiten".

Die Daten im String sehen im Prinzip immer folgendermaßen aus:

string= [1_ID;2_loByte(3-0);3_hiByte(7-4); Datensatz\CR\CR\NL
0000012C;7F880800;00178803;DSa\CR\CR\NL
0000012C;7F880800;00178803;DSa\CR\CR\NL
.
.
.
0000012C;7F880800;00178803;DSa\CR\CR\NL
\NUL\ESC\EOF]

Ich möchte nun den String folgendermaßen manipulieren:
1. In jeder Zeile soll ein Carriege Return gelöscht werden
2. Das NUL und ESC am Ende des Strings soll gelöscht werden
3. ab der zweiten Zeile möchte ich jedem Wert ein "0x" voranstellen.

Der String soll am Ende folgendes Aussehen haben:

string[]= [1_ID;2_loByte(3-0);3_hiByte(7-4); Datensatz\CR\NL
0x0000012C;0x7F880800;0x00178803;DSa\CR\NL
0x0000012C;0x7F880800;0x00178803;DSa\CR\NL
.
.
.
0x0000012C;0x7F880800;0x00178803;DSa\CR\NL
\EOF]

Wäre prima wenn mir diesbezüglich jemand weiterhelfen könnte.
Vielen Dank im voraus.

chronical_chaos

Re: String Manipulation + Konkatenation

Verfasst: Mittwoch 22. Juni 2005, 14:17
von jens
Warum nicht einfach mit replace() arbeiten?

Für solche Fälle ist folgendes Hilfreich:

Code: Alles auswählen

for i in xrange(255):  print i,"-",chr(i),chr(i).encode("String_Escape")

Code: Alles auswählen

meinString = meinString.replace("\r\r","\r") # Einfacher \CR
meinString = meinString.replace("\x00\x1b","") # Null + ESC löschen
chronical_chaos hat geschrieben:3. ab der zweiten Zeile möchte ich jedem Wert ein "0x" voranstellen.
Dann alles in einer Schreife packen...

Verfasst: Mittwoch 22. Juni 2005, 14:42
von chronical_chaos
Danke für die schnelle Antwort.

Kannst Du mir erklären was Du da machst?
for i in xrange(255): print i,"-",chr(i),chr(i).encode("String_Escape")
Das mit replace ist ne gute Idee.

Wie würdest Du die Schleife machen?

MfG

chronical_chaos

Verfasst: Mittwoch 22. Juni 2005, 21:59
von jens
chronical_chaos hat geschrieben:Kannst Du mir erklären was Du da machst?
Meine Schleife produziert einfach nur eine ASCII Tabelle. Zusätzlich erfährt man so, wie ein Zeichen in Python's String Escape aussieht. z.B. NULL ist \x00 ;) Ich einfach nur hilfreich...

In deinem Falle würde ich deinen String mit .split() aufteilen und dann in einer for-Schleife packen...
Also ungefähr so:

Code: Alles auswählen

for line in MeinString.split("\x1b\x1b\x00"):
    print line

Verfasst: Freitag 24. Juni 2005, 00:19
von BlackJack
Das "\EOF" am Ende habe ich einfach mal komplett weggelassen, weil das kein ASCII Zeichen ist:

Code: Alles auswählen

test_string = """1_ID;2_loByte(3-0);3_hiByte(7-4); Datensatz\r\r
0000012C;7F880800;00178803;DSa\r\r
0000012C;7F880800;00178803;DSa\r\r
0000012C;7F880800;00178803;DSa\r\r
\0\x1b"""

def transform(string):
    # 
    # Split into lines and replace two carriage returns by one.
    # 
    lines = map(lambda x: x.replace('\r\r', '\r'), string.split('\n'))
    # 
    # First line will not be changed further.
    # 
    result = [lines[0]]
    # 
    # Second to next to last line are processed.  Last line is discarded as it
    # contains no data anymore.
    # 
    for line in lines[1:-1]:
        # 
        # Split every line at ';', prepend '0x' to the first three fields and
        # join all fields again.
        # 
        fields = line.split(';')
        result_line = map(lambda x: '0x' + x, fields[:3]) + fields[3:]
        result.append(';'.join(result_line))
    
    return '\n'.join(result)

print transform(test_string)

Verfasst: Samstag 25. Juni 2005, 17:29
von chronical_chaos
Super! ! ! Ist genau das was ich wollte. Habs heute in mein Programm eingebaut, und funzt 1a.

Vielen Dank.

chronical_chaos