
71455
03.06.2011, aktualisiert um 16:34:57 Uhr
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 167441
Url: https://administrator.de/forum/zeichenkette-erkennen-und-exportieren-167441.html
Ausgedruckt am: 21.04.2025 um 18:04 Uhr
9 Kommentare
Neuester Kommentar
Hallo braingap,
ich habe hier mal eine Lösung in VBS erstellt, die einfachste Möglichkeit.
Den Quelltext z.B.als SearchPatternsInFile.vbs speichern.
Aufruf:
Die
Hier eine Übersicht über die Syntax der regulären Ausdrücke (aus der deutschen Version der Datei
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
Der Ausdruck
Der Ausdruck
Gruß
Friemler
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. 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

Hallo braingap, Hallo Friemler!
Ansonsten mit SubMatches (Suchmuster in Klammern) z.B.
Textbeispiel: "xy12345678xy"
Matches.Value = "12345678x"
Matches.SubMatches(0).Value = "12345678"
Gruß Dieter
Zitat von @Friemler:
Der Ausdruck
einmal oder mehrmals hintereinander vorkommen. Es wird also 5 oder 738 oder auch 0471182595436 gefunden.
Der Ausdruck
Nur als Anmerkung. Findet aber auch die ersten 8 Stellen einer z.B. 10-stelligen ZahlDer Ausdruck
[0-9]+
würde z.B. alle Stellen finden, an denen die Ziffern 0 bis 9 in beliebiger Kombination mindestenseinmal oder mehrmals hintereinander vorkommen. Es wird also 5 oder 738 oder auch 0471182595436 gefunden.
Der Ausdruck
[0-9]{8
} würde achtstellige Zahlen finden.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

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 SubMatches
Dir entgeht aber auch nichts
Gruß Dieter
Stimmt! Und habe ich mal wieder bewusst außer Acht gelassen (Asche auf mein Haupt). Mir ging es lediglich um den Hinweis auf SubMatches
Dir entgeht aber auch nichts
Gruß Dieter

Hallo bastla!
Wobei ersteres eigentlich unnötig ist
würde völlig ausreichen (immernoch SubMatches(0))
Gruß Dieter
Wobei ersteres eigentlich unnötig ist
RE.Pattern = "(\d{8})(\D|)" |
Gruß Dieter

Hallo braingap!
Die Sache mit den Dubletten, könnte man so lösen:
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
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