Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1564to1568
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Regläre Ausdrücke mit Condition

Regläre Ausdrücke mit Condition
30.06.2017 12:54:54
Andre
Hallo Forum,
ich lese per VBA eine große Textdatei (>100MB) ein. Um die eingelesenen Daten möglichst klein zu halten, möchte ich mit Hilfe regulärer Ausdrücke filtern.
Hier eine Auswahl an abstrahierten Beispielen der zu filternden Textzeilen aus der Textdatei:

Z1: Text1_Text2.Text3_Text4
Z2: Text1_Text2.Text3_Text4[0].Text5
Z3: Text1_Text2.Text3_Text4[1].Text5
Z4: Text1_Text2.Text3_Text4[0][0].Text5
Z5: Text1_Text2.Text3_Text4[0].Text5[0]
Z6: Text1_Text2.Text3_Text4[0].Text5[1]
Z7: Text1_Text2.Text3_Text4[1].Text5[1]
Text1...4 stellt variablen Text dar [a-zA-Z0-9_]

Ziel ist ein regulärer Ausdruck, für den Zeilen Z1, Z2, Z5, Z6 WAHR sind.

Match Z1:    [a-zA-Z0-9_]+\.[a-zA-Z0-9_]+
Match Z2:    [a-zA-Z0-9_]+\.[a-zA-Z0-9_]+\[0\]\.[a-zA-Z0-9_]+
Match Z5&Z6: [a-zA-Z0-9_]+\.[a-zA-Z0-9_]+\[0\]\.[a-zA-Z0-9_]+\[[0-9]\]

Soweit, so einfach.
Um irgendwie alle Einzel-Ausdrücke in einem Ausdruck zu kombinieren, denke ich, müssen hier Conditions verwendet werden. Nur fehlt mir die zündende Idee, wie das anzustellen ist.
Kann mir evtl. jemand von Euch auf die Sprünge helfen?
Besten Dank schonmal und Grüße,
Andre

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Regläre Ausdrücke mit Condition
01.07.2017 18:19:09
fcs
Hallo Andre,
mit deinen abstrakten Beispieldaten komme ich nicht weiter.
Erstelle einen kleinen Auszug deiner Textdatei (ca. 20 bis 50 Zeilen) mit typischen Daten und lade die Datei hier hoch. Falls erforderlich, anonymisiere personnebezogene oder vertrauliche Daten ohne das Schema zu verändern.
Lade zusätzlich eine Exceldatei hoch die das Ergebnis des Imports der Beispieltextdatei enthält.
&gt100 MB ist ja schon heftig. Wie importiertst du denn zur Zeit die Daten?
Bei dem von dir gewünschten Filtern müsste man wahrscheinlich einen zeilenweisen Import durchführen mit Prüfung gemäß Vergleichsschema.
Gruß
Franz
Anzeige
AW: Regläre Ausdrücke mit Condition
02.07.2017 10:15:04
Andre
Hallo Franz,
den Auszug aus der Textdatei kann ich morgen machen.
Im Moment ist der Datenimport auch zeilenweise mit einem eher rudimentären Filter, der mir noch zu viele unbenötigte Daten durchlässt.
Ich melde mich dann morgen wieder.
Schönen Sonntag und Grüße,
Andre
AW: Regläre Ausdrücke mit Condition
03.07.2017 09:18:06
fcs
Hallo Andre,
ich hab auf Basis deines Beispieltextes schon mal einen Versuch gestartet.
1. Kriterium ist die Anzahl der Punkte in einer Zeile, umggf. vieleZeilen schon Auszuschließen.
Danach wird der der Zeilentext am Punkt gesplittet und Teiltexte werden gemäß Vorgaben geprüft.
Erfüllt eine Zeile die Bedingungen dann wird sie in eine temporäre Textdatei geschhrieben.
Im Moment wird die Textdatei mit den Trefern zum Schluss in eine neue Arbeitsmappe ausgegeben per Datenimport. Zielblatt kann man aber ändern und als Parameter an das Importmakro übergeben.
Gruß
Franz

Sub prcImport_TextFile()
Dim varDatei, varTemp, strPfad As String
Dim strZeile As String, strLike As String
Dim FF1 As Integer, FF2 As Integer
Dim bolImport As Boolean
Dim varSplit As Variant, var12 As Variant, var34 As Variant, var5 As Variant
'    On Error GoTo Fehler
varDatei = Application.GetOpenFilename(Filefilter:="Textdatei (*.txt),*.txt", _
Title:="Bitte Textdateimit den Importdaten auswählen", _
ButtonText:="Auswählen")
If varDatei = False Then Exit Sub
FF1 = FreeFile()
Open varDatei For Input As #FF1
'temporäre Textdatei für Trefferzeilen öffnen
varTemp = ThisWorkbook.Path & Application.PathSeparator & "tempImport.txt"
FF2 = FreeFile()
Open varTemp For Output As #FF2
strLike = "[a-zA-Z0-9_]" 'zulässige Zeichen in Teiltexten
Do Until EOF(FF1)
Input #FF1, strZeile
bolImport = False
'Textanalyse
If Trim(strZeile) = "" Then
'Leere Zeile
Else
'Inputzeile am "."splitten
varSplit = VBA.Split(strZeile, ".")
Select Case UBound(varSplit) 'entspricht der Anzahl Punkte in der Zeile
Case 0
'keine Punkte im Zeilentext
Case 1
If UBound(varSplit) = 1 Then
If Trim(varSplit(0))  "" And fncLike(varSplit(0), strLike) Then
If Trim(varSplit(1))  "" And fncLike(varSplit(1), strLike) Then
'1. Zeile einer Serie
var12 = varSplit(0)
var34 = varSplit(1) & "[0]"
var5 = ""
bolImport = True
End If
End If
End If
Case 2
If varSplit(0) = var12 Then
If varSplit(1) = var34 Then
'prüfen ob 1. Zeile mit Zusatzrtext (ohne [#] am Ende)
If Trim(varSplit(2))  "" And fncLike(varSplit(2), strLike) Then
var5 = varSplit(2)
bolImport = True
'prüfen ob weitere Zeilen mit Zusatztext [#] am Ende
ElseIf varSplit(2) Like var5 & "[[]#]" Then
bolImport = True
End If
End If
End If
Case Else
'mehr als 2 Punkte im Zeilentext
End Select
End If
If bolImport = True Then
Print #FF2, strZeile
End If
Loop
Close FF1
Close FF2
Call prcText_Import(strFile:=varTemp, strStartzelle:="A2", strOtherDilimiter:=".")
VBA.Kill Pathname:=varTemp
Fehler:
With Err
Select Case .Number
Case 0 'Alles OK
Case Else
MsgBox "Fehler-Nr.: " & .Number & vbLf & .Description
Close
End Select
End With
End Sub
Public Function fncLike(ByVal strText As String, ByVal strLike As String) As Boolean
'Vergleich aller Zeichen in einem Text mit einem Muster Text
Dim intPos As Integer
fncLike = True
For intPos = 1 To Len(strText)
If Not Mid(strText, intPos, 1) Like strLike Then
fncLike = False
Exit For
End If
Next
End Function
Sub prcText_Import(ByVal strFile As String, _
Optional wksZiel As Worksheet, _
Optional strStartzelle As String = "A1", _
Optional strOtherDilimiter As String = "")
' Text_Import Makro
Dim wkbZiel As Workbook
Dim objQT As QueryTable
If wksZiel Is Nothing Then
Application.Workbooks.Add Template:=xlWBATWorksheet
Set wksZiel = ActiveWorkbook.Worksheets(1)
End If
Set wkbZiel = wksZiel.Parent
wksZiel.UsedRange.Clear
With wksZiel.QueryTables.Add(Connection:= _
"TEXT;" & strFile, Destination:=wksZiel.Range(strStartzelle))
.Name = "tempImport"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = False
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 1252 'Windows Westeuropa
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileOtherDelimiter = strOtherDilimiter
.TextFileColumnDataTypes = Array(1, 1, 1)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
Set objQT = wksZiel.QueryTables(1)
With objQT
wkbZiel.Connections("tempImport").Delete
.Delete
End With
End Sub

Anzeige
AW: Regläre Ausdrücke mit Condition
03.07.2017 11:11:55
Andre
Hallo Franz,
habe Deinen Beitrag jetzt erst gelesen. Besten Dank schonmal dafür!
Dein Ansatz ist natürlich ganz anders, als ich mir das gedacht habe - hatte mich irgendwie auf die regulären Ausdrücke versteift.
Ich gehe das mal in Ruhe durch.
Bis später,
Andre
AW: Regläre Ausdrücke mit Condition
03.07.2017 09:30:33
Andre
Guten Morgen Franz,
ich habe mal die betreffenden Daten beispielhaft vorbereitet:

https://www.herber.de/bbs/user/114654.txt

https://www.herber.de/bbs/user/114655.xlsm

Alle importierten Daten werden in Spalte A geschrieben.
In Spalte C habe ich markiert, welche Daten durchgelassen bzw. gefiltert werden sollen.
Viele Grüße,
Andre
Anzeige
AW: Regläre Ausdrücke bei Import von Textdatei
04.07.2017 17:04:31
Textdatei
Hallo Andre,
ich hab dein Makro überarbeitet/ergänzt.
https://www.herber.de/bbs/user/114693.xlsm
Wesentliche Änderungen:
1. Ich hab einen 2. regulären Ausdruck eingebaur.
Mit diesem wird geprüft, ob ein doppelte Paar eckiger Klammern mit Ziffer in der Zeile vorhanden ist,
2. Mit Split und Like wird geprüft, ob zwischen dem 1. und 2. Punkt im Zeilentext ein eckiges Klammerpaar mit Ziffer &lt&gt0 vorhanden ist. Dies könnte man auch mit einem weiteren regulären Ausdruck testen - bringt aber nichts bei der Geschwindigkeit bei der Makro-Ausführung.
3. Redimensionieren des Ergebnis-Datenarrays
Dies wird nicht mehr bei jedem Treffer durchgeführt sondern nur in großen Zahlerschritten. Das Redimensinieren bei der Makroausführung ist relativ zeitaufwendigist, speziell wenn das Array größer wird.
4. Das Ergebnis-Array wird zum Schluss umgeschrieben in ein Array mit 1 Spalte.
zusätlich werden die TABs am Zeilenanfang entfernt duch Ersetzendurch "".
So können die Daten in einer Aweisung in die Tabelle eingetragen werden, was superschnell ist im Vergleich zum zellenweisen Eintragen in einer For-Next-Schleife.
5. Zum Schluss werden die Objekt-Variablen und die Daten-Arrays zurückgesetzt.
6. End-Anweisung
Diese stoppt radikal alle Makro-Aktivitäten in der Excel-Anwendung.
Besser ist meist mit Exit Sub oder einem anderen kontrollierten Ausstieg aus dem Makro zu arbeiten.
Ich hab das Ganze jetzt in einer aufgebläten Textdatei getestet (ca. 15,6 MB, 315000 Zeilen).
Ausführungszeit des Makros: ca. 5 Sekunden nach dem Öffnen der Textdatei.
LG
Franz
Anzeige
AW: Regläre Ausdrücke bei Import von Textdatei
05.07.2017 07:38:52
Textdatei
Hallo Franz,
herzlichen Dank für Deine Hilfe - hat mir echt weitergeholfen!
Viele Grüße,
Andre

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige