71455
Goto Top

Zeichenkette erkennen und exportieren

Bestimmt Zeichenketten aus TXT oder Excel exportieren und dann nach Dopplungen untersuchen

Hi!
Ich möchte aus einer per OCR hergestellten Datei (in Wirklichkeit werden es ca 500) die leider kein stringentes Erscheinungsbild haben (OCR halt) bestimmt Zeichenketten herausfiltern und exportieren.
z.B. alle Zeichenketten, die irgendwo einen 8stelligen Zahlencode enthalten.
Ich dachte da an: such mal alle Zeichenketten *########* und schreib die in eine txt. Dann kann ich per DOPPELT die betreffenden Zellen bzw Nummern herausfinden.
Hat jemand eine Idee?

THX

Braingap

Content-Key: 167441

Url: https://administrator.de/contentid/167441

Printed on: April 25, 2024 at 06:04 o'clock

Member: Pjordorf
Pjordorf Jun 03, 2011 at 14:58:32 (UTC)
Goto Top
Hallo,

Zitat von @71455:
Hat jemand eine Idee?
Die Frage ist mal wieder ein Klassiker. Ja, ich habe eine Idee. Sogar mehrere.

Eine idee ist du verwendest mal die Suche. Selbst hier im Forum wirst du einige Hundert Fragen und Antworten finden welche mit Suche(n) in Textdateien zu tun haben.

Gruß,
Peter
Member: Friemler
Friemler Jun 03, 2011 at 16:04:52 (UTC)
Goto Top
Hallo braingap,

ich habe hier mal eine Lösung in VBS erstellt, die einfachste Möglichkeit.
Const ForReading = 1
Const ForWriting = 2
Const AsASCII    = 0

If WScript.Arguments.Count > 2 Then
  Set objFSO    = CreateObject("Scripting.FileSystemObject")  
  Set objInFile = objFSO.OpenTextFile(WScript.Arguments(0), ForReading, False, AsASCII)
  strContent    = objInFile.ReadAll
  objInFile.Close
  
  Set objOutFile     = objFSO.OpenTextFile(WScript.Arguments(1), ForWriting, True, AsASCII)
  Set objPatternFile = objFSO.OpenTextFile(WScript.Arguments(2), ForReading, False, AsASCII)
  Set objRegExp      = New RegExp
  objRegExp.Global   = True

  While not objPatternFile.AtEndOfStream
    objRegExp.Pattern = objPatternFile.ReadLine
    Set colMatches    = objRegExp.Execute(strContent)
  
    For Each objMatch In colMatches
      objOutFile.WriteLine objMatch.Value
    Next
    
    Set colMatches = Nothing
  Wend
  
  objPatternFile.Close
  objOutFile.Close
End If

Den Quelltext z.B.als SearchPatternsInFile.vbs speichern.

Aufruf:
cscript /nologo  "SearchPatternsInFile.vbs" "Eingabedatei.txt" "Ausgabedatei.txt" "Suchmusterdatei.txt"

Die Suchmusterdatei.txt muss in jeder Zeile ein Suchmuster enthalten. Als Suchmuster werden die regulären Ausdrücke von VBS verwendet. Alle gefundenen Stellen werden in jeweils eine Zeile der Ausgabedatei.txt geschrieben.

Hier eine Übersicht über die Syntax der regulären Ausdrücke (aus der deutschen Version der Datei script56.chm (Sprachreferenz von VBS) von Microsoft übernommen; einen Link auf diese Datei findet man hier):

Zeichen Beschreibung
\ Markiert das folgende Zeichen als Sonder- oder wortgenaues (literales) Zeichen. Beispielsweise entspricht "n" dem Zeichen "n". "\n" entspricht einem Zeilenumbruchzeichen. Die Folge "\\" entspricht "\", und "\(" entspricht "(".
^ Entspricht dem Anfang der Eingabe.
$ Entspricht dem Ende der Eingabe.
* Entspricht dem vorhergehenden Zeichen kein oder mehrere Male. Beispielsweise entspricht "zo*" entweder "z" oder "zoo".
+ Entspricht dem vorhergehenden Zeichen ein oder mehrere Male. "zo+" entspricht beispielsweise "zoo", nicht aber "z".
? Entspricht dem vorhergehenden Zeichen kein- oder einmal. Beispielsweise entspricht "a?eu?" dem "eu" in "neuer".
. Entspricht allen Einzelzeichen außer einem Zeilenumbruchzeichen.
(Muster) Entspricht Muster und speichert die Entsprechung. Die übereinstimmende Teilzeichenfolge kann aus der sich ergebenden Matches-Auflistung unter Verwendung von Item ...[n] abgerufen werden. Verwenden Sie zum Abgleichen von in Klammern ( ) gesetzten Zeichen "\(" oder "\)".
x|y Entspricht entweder x oder y. Beispielsweise entspricht "sch|blau" entweder "sch" oder "blau". "(sch|b)lau" entspricht "schlau" oder "blau".
{n} n ist eine nicht negative Ganzzahl. Entspricht exakt n Mal. Beispielsweise entspricht "o{2}" nicht dem "o" in "Robert", jedoch den ersten beiden "o" in "Booooot".
{n,} n ist eine nicht negative Ganzzahl. Entspricht mindestens n Mal. Zum Beispiel entspricht "o{2,}" nicht dem "o" in "Robert", aber allen "o" in "Booooot". "o{1,}" ist äquivalent mit "o+". "o{0,}" ist äquivalent mit "o*".
{n,m} m und n sind nicht negative Ganzzahlen. Entspricht mindestens n und höchstens m Mal. Beispielsweise entspricht "o{1,3}" den ersten drei "o" in "Boooooot". "o{0,1}" ist äquivalent mit "o?".
[xyz] Eine Gruppe von Zeichen. Entspricht einem beliebigen der enthaltenen Zeichen. "[abc]" entspricht z. B. dem "a" in "fallen".
[^xyz] Eine Gruppe ausgeschlossener Zeichen. Entspricht allen nicht enthaltenen Zeichen. "[^abc]" entspricht z. B. dem "f" in "fallen".
[a-z] Ein Zeichenbereich. Entspricht allen Zeichen im angegebenen Bereich. Beispielsweise entspricht "[a-z]" allen alphabetischen Zeichen in Kleinschreibung des Bereichs "a" bis "z".
[^m-z] Ein ausgeschlossener Bereich an Zeichen. Entspricht allen Zeichen, die im angegebenen Bereich nicht enthalten sind. Zum Beispiel entspricht "[^m-z]" allen Zeichen, die im Bereich "m" bis "z" nicht enthalten sind.
\b Entspricht einer Wortgrenze, d. h. der Position zwischen einem Wort und einem Leerzeichen. "er\b" entspricht beispielsweise dem "er" in "neuer", nicht jedoch dem "er" in "verb".
\B Entspricht einer Nichtwortgrenze. "ee*r\B" entspricht dem "eer" in "leeren".
\d Entspricht einer Ziffer. Äquivalent zu [0-9].
\D Entspricht einer Nichtziffer. Äquivalent zu [^0-9].
\f Entspricht einem Seitenvorschubzeichen.
\n Entspricht einem Zeilenumbruchzeichen.
\r Entspricht einem Wagenrücklaufzeichen.
\s Entspricht beliebigen Leerräumen wie Leerzeichen, Tabulator, Seitenvorschub usw. Äquivalent zu "[ \f\n\r\t\v]".
\S Entspricht beliebigen Nichtleerräumen. Äquivalent zu "[^ \f\n\r\t\v]".
\t Entspricht einem Tabulatorzeichen.
\v Entspricht einem vertikalen Tabulatorzeichen.
\w Entspricht allen alphabetischen Zeichen einschließlich Unterstrich. Äquivalent zu "[A-Za-z0-9_]".
\W Entspricht allen nicht alphabetischen Zeichen. Äquivalent zu "[^A-Za-z0-9_]".
\Zahl Entspricht Zahl, wenn Zahl eine positive Ganzzahl ist. Ein Rückverweis auf gespeicherte Entsprechungen. "(.)\1" entspricht z. B. zwei aufeinander folgenden identischen Zeichen.
\n Entspricht n, wobei n ein oktaler Escape-Wert ist. Oktale Escape-Werte können 1, 2 oder 3 Stellen aufweisen. Beispielsweise entspricht sowohl "\11" als auch "\011" dem Tabulatorzeichen. "\0011" ist äquivalent zu "\001" & "1". Oktale Escape-Werte dürfen 256 nicht überschreiten, da andernfalls nur die ersten beiden Stellen den Ausdruck enthalten. Ermöglicht die Verwendung von ASCII-Codes in regulären Ausdrücken.
\xn Entspricht n, wobei n ein hexadezimaler Escape-Wert ist. Hexadezimale Escape-Werte können nur genau zwei Stellen aufweisen. "\x41" entspricht beispielsweise "A". "\x041" ist äquivalent zu "\x04" & "1". Ermöglicht die Verwendung von ASCII-Codes in regulären Ausdrücken.

Da Du nicht genauer spezifizieren konntest, nach was Du suchen willst, musst Du dich jetzt eben ein bisschen mit der Syntax von regulären Ausdrücken beschäftigen und Dir die Suchmusterdatei.txt selbst erstellen. face-wink

Der Ausdruck [0-9]+ würde z.B. alle Stellen finden, an denen die Ziffern 0 bis 9 in beliebiger Kombination mindestens einmal oder mehrmals hintereinander vorkommen. Es wird also 5 oder 738 oder auch 0471182595436 gefunden.

Der Ausdruck [0-9]{8} würde achtstellige Zahlen finden.

Gruß
Friemler
Mitglied: 76109
76109 Jun 04, 2011 at 10:08:03 (UTC)
Goto Top
Hallo braingap, Hallo Friemler!

Zitat von @Friemler:
Der Ausdruck [0-9]+ würde z.B. alle Stellen finden, an denen die Ziffern 0 bis 9 in beliebiger Kombination mindestens
einmal oder mehrmals hintereinander vorkommen. Es wird also 5 oder 738 oder auch 0471182595436 gefunden.

Der Ausdruck [0-9]{8} würde achtstellige Zahlen finden.
Nur als Anmerkung. Findet aber auch die ersten 8 Stellen einer z.B. 10-stelligen Zahl

Ansonsten mit SubMatches (Suchmuster in Klammern) z.B.
Set RE = New RegExp

RE.Pattern = "(\d{8})\D"   'Nur 8 Ziffern + Nicht-Ziffer finden  

For Each Matches In RE.Execute(Text)	'Text = File.ReadAll  
    Zahl = Matches.SubMatches(0)
Next

Textbeispiel: "xy12345678xy"

Matches.Value = "12345678x"
Matches.SubMatches(0).Value = "12345678"

Gruß Dieter
Member: bastla
bastla Jun 04, 2011 at 10:55:42 (UTC)
Goto Top
Hallo Dieter!

Es wäre ev noch daran zu denken, dass die gesuchte Zahl am Ende der Datei ohne Zeilenschaltung steht (bzw, um Dein Textbeispiel zu variieren: "xy12345678") ...

Grüße
bastla
Mitglied: 76109
76109 Jun 04, 2011 at 11:07:19 (UTC)
Goto Top
Hallo bastla!

Stimmt! Und habe ich mal wieder bewusst außer Acht gelassen (Asche auf mein Haupt). Mir ging es lediglich um den Hinweis auf SubMatchesface-wink

Dir entgeht aber auch nichtsface-smile

Gruß Dieter
Member: bastla
bastla Jun 04, 2011 at 11:10:08 (UTC)
Goto Top
Hallo Dieter!
Mir ging es lediglich um den Hinweis auf SubMatchesface-wink
Hatte ich mir schon gedacht ... face-wink

Auf die Schnelle käme ich auf
RE.Pattern = "(|\D)(\d{8})(\D|)"
mit "SubMatches(1)" ...

Grüße
bastla
Mitglied: 76109
76109 Jun 04, 2011 at 11:43:30 (UTC)
Goto Top
Hallo bastla!

Wobei ersteres eigentlich unnötig ist
RE.Pattern = "(\d{8})(\D|)"
würde völlig ausreichen (immernoch SubMatches(0))face-wink

Gruß Dieter
Mitglied: 76109
76109 Jun 04, 2011 at 11:44:53 (UTC)
Goto Top
Hallo braingap!

Die Sache mit den Dubletten, könnte man so lösen:
....
Set RE = New RegExp
Set DT = CreateObject("Scripting.Dictionary")  

With RE
   .Global = True
  '.IgnoreCase = True  
   .Pattern = "(\d{8})(\D|)"  
End With

For Each Matches In RE.Execute(Text)
    If Not DT.Exists("$" & Matches.SubMatches(0)) Then  
        DT.Add "$" & Matches.SubMatches(0), 0  
    End If
Next
  
For Each Key In DT
    'File.WriteLine Mid(Key, 2)  
Next

Wobei für den Dictionary-Exist-Test, dem Zahlenwert ein $-Zeichen vorangestellt wird, weil die Exist-Funktion mit reinen Zahlenwerten offensichtlich nicht funktioniert. Zumindest, haben das meine Test's ergeben.

Gruß Dieter
Mitglied: 71455
71455 Jun 04, 2011 at 16:58:13 (UTC)
Goto Top
Super und vielen Dank an alle!