Bestimmte Daten aus einer Datei auslesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
sfx2k
User
Beiträge: 48
Registriert: Dienstag 2. September 2014, 13:29

Samstag 20. September 2014, 20:13

Hallo,

ich habe ein decodiertes PCL-File, welches folgenden Aufbau hat (Ausschnitt):

Code: Alles auswählen

000be0cf       PCL Parameterised      <Esc>*c15D        Assign Font ID Number (identifier = 15)
000be0d5       PCL Parameterised      <Esc>*c0F         Font Control: Delete All Soft Fonts
000be0da       PCL Parameterised      <Esc>(s1P         Primary Font: Spacing: Proportional
000be0df       PCL Parameterised      <Esc>(s12.00V     Primary Font: Height (12.00 points)
000be0e8       PCL Parameterised      <Esc>(s4148T      Primary Font: Typeface (4148 = Univers)
000be0f0       PCL Parameterised      <Esc>(s6.00V      Primary Font: Height (6.00 points)
000be0f8       PCL Parameterised      <Esc>*p3297.93Y   Cursor Position Vertical   (3297.93 PCL units)
000be103       PCL Parameterised      <Esc>*p275.00X    Cursor Position Horizontal (275.00 PCL units)
000be10d       Data                                     Gesch<ext>ftsf<ext>hrung: Hans-Lothar Sch<ext>fer (V
000be134                                                ors.), Steffen B<ext>tjer, Manfred Kreuzer, Karl Mol
000be164                                                l, Norbert Scheller, Thomas Werner <ext> Aufsichtsra
000be194                                                t: Hilko Schomerus (Vors.)
000be1af       PCL Parameterised      <Esc>%1B          Enter HP-GL/2 Mode: Pen = PCL
               Comment                                  Switch language to HP-GL/2
000be1b3       HP-GL/2 Command        IN;               Initialise
000be1b6       HP-GL/2 Command        CO"$HD-1$AB00800  
000be1c6                                00131033300000  
000be1d4                                0000120141231   
000be1e2                                  07XYD 000001  
000be1f0                                0               
000be1fe                                       XXXX 00  
000be20c                                03              
000be21a                                                
000be228                                                
000be236                                    $;"         Comment
               Comment                                  Previous sequence not terminated by semi-colon
               Comment                                  Switch language to PCL
000be23d       PCL Parameterised      <Esc>%0A          Enter PCL Mode: Cursor = PCL
000be241       PCL Parameterised      <Esc>%1B          Enter HP-GL/2 Mode: Pen = PCL
               Comment                                  Switch language to HP-GL/2
000be245       HP-GL/2 Command        IN;               Initialise
000be248       HP-GL/2 Command        CO"$HD-2$00       
000be258                                          000   
000be266                                  00000000      
000be274                                                
000be282                                                
000be290                                                
000be29e                                                
000be2ac                                                
000be2ba                                                
000be2c8                                    $;"         Comment
               Comment                                  Previous sequence not terminated by semi-colon
               Comment                                  Switch language to PCL
000be2cf       PCL Parameterised      <Esc>%0A          Enter PCL Mode: Cursor = PCL
000be2d3       PCL Parameterised      <Esc>%1B          Enter HP-GL/2 Mode: Pen = PCL
               Comment                                  Switch language to HP-GL/2
Mein Ziel ist es nun, die Kommentare aus dem Datenstrom zu extrahieren.
Ein Kommentar beginnt mit "$HD-x wobei x einer Zahl zwischen 1 und 7 entspricht.
Der Kommentar endet mit $;".

Ich habe mir folgende Lösung überlegt, und würde gerne von Euch wissen, was man besser, mehr Pyhton-like, machen kann.

Die Daten sind im Prinzip in vier Spalten aufgeteilt.
1. Spalte = Offset
2. Spalte = Art des Eintrags
3. Spalte = Daten
4. Spalte = Erläuterung

Als erstes extrahiere ich die dritte Spalte in einen String, da das die Daten sind, die mich interessieren.

Code: Alles auswählen

    
    COL_COMMENT_BEGIN = 40
    COL_COMMENT_END = 54

    with open(filename) as f:
        value_data = ''.join([l[COL_COMMENT_BEGIN:COL_COMMENT_END] 
                              for l in f])
Danach jage ich einen Regulären Ausdruck über den String und lasse mir alle gefundenen Kommentare in eine Liste schreiben, die ich dann zurück gebe.

Code: Alles auswählen

    
    return re.findall(r'"\$HD-[1-7].*?\$;"', value_data)
Anregungen? Besten Dank :)
BlackJack

Samstag 20. September 2014, 21:03

@sfx2k: Ist denn sichergestellt das das Muster niemals in der Spalte vorkommen kann *ohne* das es ein Kommentar ist? Eventuell wäre es ja eindeutiger die letzte Spalte nach dem "Comment" auszuwerten um zu entscheiden was in der Spalte davor ein Kommentar ist.
sfx2k
User
Beiträge: 48
Registriert: Dienstag 2. September 2014, 13:29

Samstag 20. September 2014, 21:19

BlackJack hat geschrieben:@sfx2k: Ist denn sichergestellt das das Muster niemals in der Spalte vorkommen kann *ohne* das es ein Kommentar ist? Eventuell wäre es ja eindeutiger die letzte Spalte nach dem "Comment" auszuwerten um zu entscheiden was in der Spalte davor ein Kommentar ist.
Danke für Deine Antwort.

Da ich die Daten selber erzeuge (also die PCL-Rohdaten) ist das sichergestellt, ja :)

Ist es denn vom Vorgehen her, die Daten zu extrahieren, so in Ordnung, oder könnte man es, wie gesagt, etwas mehr nach Python-Art bzw. besser umsetzen?
Damit meine ich nicht noch weiter verschachtelte Anweisungen oder so, sondern vielleicht mit anderen Datentypen oder was auch immer.
Aber nur, wenn es auch wirklich effektiver ist.
Antworten