in

Datei zeilenweise einlesen und mit Regex prüfen

Letzter Beitrag 02-22-2010 18:31 von mp3hacker. 4 Antworten.
Seite 1 von 1 (5 Treffer)
Beiträge sortieren: Zurück Weiter
  • 02-22-2010 11:50

    Datei zeilenweise einlesen und mit Regex prüfen

    Hallo zusammen. 

    Meine Erfahrungen mit VB.NET sind noch nicht besonders gut, aber ein paar Grundkenntnisse (Schleifen, if-else, lesen und schreiben von Dateien) von C hab ich schon mal.

    Ich soll ein Programm schreiben, dass eine PDF in eine Textdatei umwandelt (hab ich mithilfe von pdftotext schon geschafft und auch implementiert).

    Danach lese ich den Text aus der erzeugten Datei zeilenweise ein und möchte nach einem Muster mit Regex suchen. Wenn dieses Muster vorhanden ist, soll es in eine Datei geschrieben werden. Das Schreiben in eine Datei hab ich bisher noch weggelassen, da ich die Ausgabe erstmal auf der Konsole kontrollieren möchte. Den kompletten Text auslesen und ausgeben ist kein Problem, sobald ich aber den Regex Teil dazu tue, bekomme ich eine Fehlermeldung: (siehe die Fehlermeldung im Anhang)

    Der Code ist auch mal angehangen. Die vielen Beispiele zu Regex und VB.NET beschränken sich meistens auf eine statische Zeile voller Zeichen. Das kann ich aber in meinem Falle nicht gebrauchen.

    Muss ich in der Schleife vielleicht nochmals eine Schleife für die Regex Prüfung einbauen (ist Consolenprogrammierung):

     

            Do
                txt = objDateiLeser.ReadLine

                Dim re1 As String = ".*?" 'Non-greedy match on filler
                Dim re2 As String = "(BL)[0-9]{7}"   'Word 1
                Dim r As Regex = New Regex(re1 + re2, RegexOptions.IgnoreCase Or RegexOptions.Singleline)
                Dim m As Match = r.Match(txt)
                If (m.Success) Then
                    Dim word1 = m.Groups(1)
                    Console.WriteLine("(" + word1.ToString() + ")")
                End If

            Loop Until txt Is Nothing

     

    Ich danke schon mal für eine Hilfestellung um die Fehlermeldung wegzubekommen. Achja, die Regex aus re2 bezieht sich auf die BL-Nummer in der ausgabe.txt ! Ich habe auch mal eine ausgabe.jpg hinzugefügt um zu zeigen, welche Werte ich heraus extrahieren muss. Die Werte in den Positionen gelten dann für alle Positionen.

     Danke für eine Hilfe.

     

    Grüße aus Calw,

    Tobias Aichele

    Abgelegt unter: ,
    • IP-Adresse ist Registriert
  • 02-22-2010 15:05 Antwort zu

    • Peter_Punkt
    • Top 10 Mitwirkender
    • Registriert am 03-28-2007
    • VS 2005/2008/2010, VB.NET, Office 2002, VB6, Win 7
    • Beiträge 1.968

    AW: Datei zeilenweise einlesen und mit Regex prüfen

    Antworten

    So geht's:

    Zunächst erstmal mein Kompliment für die genaue Problembeschreibung und die diversen Dateien, die ein Nachstellen des Problem erheblich erleichtern. Ich wollte, daß die Dokumenation wäre immer so vollständig.

    Zum Problem:

    Ich habe die schließende Klammer ) in re2 ans Ende und den ganzen Aufbau der RegEx vor die Do-Schleife gelegt. Außerdem habe ich das Schleifenende korrigiert (es soll bei Dateiende 'EndOfStream' aufhören. Außerdem habe ich dem word1 einen passenden Typ verpasst.

    Hier der geänderte Code:

            Dim re1 As String = ".*?"           'Non-greedy match on filler
            Dim re2 As String = "(BL[0-9]{7})"    'Word 1
            Dim r As Regex = New Regex(re1 + re2, RegexOptions.IgnoreCase Or RegexOptions.Singleline)
    
            Do
                txt = objDateiLeser.ReadLine
    
                Dim m As Match = r.Match(txt)
    
                If (m.Success) Then
                    Dim word1 As Group = m.Groups(1)
    
                    Debug.WriteLine(word1.ToString)
                End If
    
            Loop Until objDateiLeser.EndOfStream
    
            objDateiLeser.Close()
    PS: Bitte auch Deinen Beitrag auf  http://blog.tobis-bu.de/ korrigieren.
    Zwar weiß ich viel, doch möcht' ich alles wissen.
    Dass ich erkenne, was die Welt im Innersten zusammenhält
    • IP-Adresse ist Registriert
  • 02-22-2010 16:53 Antwort zu

    AW: Datei zeilenweise einlesen und mit Regex prüfen

    Dankeschön. Zuerst hab ich es reinkopiert und es wurde nichts angezeigt, nachdem ich das Debug.WriteLine zu Console.WriteLine umgeändert habe ging wieder alles.

    Kannst du mir noch geschwind zeigen, wie ich das Regex "([0-9]{2}.[0-9]{3}.[0-9]{4}.[0-9]{1})" um Artikelnummern wie 56.702.7053.0 zu filtern und auszugeben

     Ich habs folgendermaßen probiert: 

            Dim re1 As String = ".*?"           'Non-greedy match on filler
            Dim re2 As String = "(BL[0-9]{7})"    'Word 1
            Dim r As Regex = New Regex(re1 + re2, RegexOptions.IgnoreCase Or RegexOptions.Singleline)

            Dim re3 As String = ".*?"           'Non-greedy match on filler
            Dim re4 As String = "([0-9]{2}.[0-9]{3}.[0-9]{4}.[0-9]{1})"    'Word 1
            Dim r1 As Regex = New Regex(re3 + re4, RegexOptions.IgnoreCase Or RegexOptions.Singleline)

            Do
                txt = objDateiLeser.ReadLine
                'Console.WriteLine(txt)
                'Console.ReadKey()
                Dim m As Match = r.Match(txt)
                Dim m1 As Match = r1.Match(txt)

                If (m.Success) Then
                    Dim word1 As Group = m.Groups(1)
                    Console.WriteLine(word1.ToString)
                End If

                If (m1.Success) Then
                    Dim word2 As Group = m.Groups(1)
                    Console.WriteLine(word2.ToString)
                End If

            Loop Until objDateiLeser.EndOfStream

     Aber das Programm zeigt dann nur die BL0413412 an und darunter Leerzeichen. 

    Anhand der zweiten Regex müssten sich dann sicher die weiteren Regex für mich erschließen. Danke nochmals für eine weitere Hilfe.

    Offtopic: Wie hast du eigentlich meinen Blog gefunden? Einfach durch eine Googlesuche? 

    • IP-Adresse ist Registriert
  • 02-22-2010 17:46 Antwort zu

    • Peter_Punkt
    • Top 10 Mitwirkender
    • Registriert am 03-28-2007
    • VS 2005/2008/2010, VB.NET, Office 2002, VB6, Win 7
    • Beiträge 1.968

    AW: Datei zeilenweise einlesen und mit Regex prüfen

    Antworten

    Zunächst hast Du eine Tippfehler: Der 2. Dim muß mit m1. geschrieben werden:      Dim word2 As Group = m1.Groups(1)

    Um scharf auf einen Punkt testen willst, darft Du in re4 nicht einfach . schreiben, sondern \. da der Punkt (ohne \) eine besondere Bedeutung besitzt und auf ein beliebiges Zeichen testet.

    Außerdem kommen in Deinem Text auch Artikelnummern vor, die mit einem Buchstaben beginnen. Du mußt daher für die ersten zwei Zeichen auch eine Alternative vorsehen. Alternativen werden durch einen senkrechten Strich | voneinader getrennt.

    Die Anweisung Debug.WriteLine zur Ausgabe in das sog. 'Direktfenster' bevorzuge ich deswegen, weil die ausgegebenen Werte auch nach Programmende sichtbar sind zur Analyse. Das Direktfenster öffnet man mit Strg+G

    Ja, Deinen Blog habe ich über Google gefunden

    Hier nochmal der gesamte Code:

            Dim re1 As String = ".*?"           'Non-greedy match on filler
            Dim re2 As String = "(BL[0-9]{7})"    'Word 1
            Dim r As Regex = New Regex(re1 + re2, RegexOptions.IgnoreCase Or RegexOptions.Singleline)
    
            Dim re3 As String = ".*?"           'Non-greedy match on filler
            Dim re4 As String = "((\w{1}\d{1}|[0-9]{2})\.[0-9]{3}\.[0-9]{4}\.[0-9]{1})"    'Word 1
            Dim r1 As Regex = New Regex(re3 + re4, RegexOptions.IgnoreCase Or RegexOptions.Singleline)
    
            Do
                txt = objDateiLeser.ReadLine
    
                Dim m As Match = r.Match(txt)
                Dim m1 As Match = r1.Match(txt)
    
                If (m.Success) Then
                    Dim word1 As Group = m.Groups(1)
                    Debug.WriteLine(word1.ToString)
                End If
    
                If (m1.Success) Then
                    Dim word2 As Group = m1.Groups(1)
                    Debug.WriteLine(word2.ToString)
                End If
    
            Loop Until objDateiLeser.EndOfStream
    
            objDateiLeser.Close()
    Zwar weiß ich viel, doch möcht' ich alles wissen.
    Dass ich erkenne, was die Welt im Innersten zusammenhält
    • IP-Adresse ist Registriert
  • 02-22-2010 18:31 Antwort zu

    AW: Datei zeilenweise einlesen und mit Regex prüfen

    Dankeschön, werde ich morgen gleich so einbauen...

    Ich hab die Regexe ja eigentlich immer mit txt2re.com gemacht, aber die einzeiligen Regexp passen irgendwie besser. Da muss ich wohl noch ein wenig tiefer reinlesen.

    Danke nochmal für die Hilfe, nun klappt ja alles, den Rest probier ich mal selber. :D

    • IP-Adresse ist Registriert
Seite 1 von 1 (5 Treffer)
Alle Rechte vorbehalten. Zum Impressum