Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
700to704
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
700to704
700to704
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

VBA: "Split" bei gequoteten Werten

VBA: "Split" bei gequoteten Werten
02.12.2005 23:33:14
Christian
Hallo VBA Profis,
ich dreh mich schon seit Stunden im Kreis und hoffe, ihr könnt mir helfen...
Aus diversen log-files (txt-Dateien) muss ich bestimmte Werte pro Zeile auslesen. Die Felder dieser txt-Datei sind Komma-separiert. Das Problem ist, dass numerische Werte soweit sie Komma-Stellen haben, ebenfalls mit Komma dargestellt werden - dann allerdings mit Anführungszeichen.
Beispiel:

,1,blabla,12 secs,1 sec,"1,123 secs",,
,2,blabla,"12,345 secs",23 secs,"4,567 secs",blabla,
,3,blabla,1 sec,"45,123 secs","12,345 secs", 1 sec,"12,001 secs"

Ziel ist es, aus den Text-Dateien pro Zeile ein Array zu erzeugen mit den Werten (entsprechend obigen Bsp):

1   blabla   12        1        1.123
2   blabla   12.345   23        4.657   blabla
3   blabla   1        45.123   12.345   1        12.001
und diese Arrays in eine neue txt-Datei zu schreiben.
mein bisheriger Ansatz lautet:
Sub SplitLog()
Dim strSrcFile As String, strDstFile As String, strLine As String
Dim intFile as Integer, intLine As Integer, intCnt As Integer
Dim arrLine()
strSrcFile = "D:\Quelle.txt"
strDstFile = "D:\Ziel.txt"
intFile = FreeFile
Open strSrcFile For Input As #intFile
Do Until EOF(intFile)
Line input #intFile, strLine
' hier fehlt mir der entscheidende Schritt, wie die Zeilen
' so gesplittet werden können, dass Dezimalzahlen zusammen bleiben
Redim Preserve arrLine(intLine)
arrLine(intLine) = strLine
intLine = intLine + 1
Loop
Close #intFile
Open strDstFile For Append As #intFile
For intCnt = 0 To UBound(arrLine)
Print #intFile, arrLine(intCnt)
Next
Close #intFile
Ich wäre euch sehr dankbar für eine Lösung, wie die Zeilen der Quell-Datei so gesplittet werden können, dass Werte wie "12,123" nicht am Dezimal-Trennzeichen getrennt werden. Gleichzeitig müsste auch noch "sec" bzw. "secs" abgeschnitten werden.
Vielen Dank für eure Hilfe
Gruß
Christian

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA: "Split" bei gequoteten Werten
03.12.2005 08:31:15
Erich
Hallo Christian,
damit werden Gänsefüße, sec, secs eliminiert und das Semikolon als Trennzeichen verwendet:

Sub SplitLog()
Dim strSrcFile As String, strDstFile As String, strLine As String
Dim intFile As Integer, intLine As Integer, intCnt As Integer
Dim arrLine(), intRec As Long, inQuote As Boolean
strSrcFile = "F:\exc\w-w-w\tmp\Split-in.txt"
strDstFile = "F:\exc\w-w-w\tmp\Split-out.txt"
intFile = FreeFile
Open strSrcFile For Input As #intFile
Do Until EOF(intFile)
Line Input #intFile, strLine
intLine = intLine + 1
Loop
Close #intFile
ReDim Preserve arrLine(intLine)
Open strSrcFile For Input As #intFile
Do Until EOF(intFile)
Line Input #intFile, strLine
strLine = Replace(strLine, " secs", "")
strLine = Replace(strLine, " sec", "")
For intCnt = 1 To Len(strLine)
Select Case Mid(strLine, intCnt, 1)
Case Chr(34)
inQuote = Not inQuote
Case ","
If Not inQuote Then Mid(strLine, intCnt, 1) = ";"
End Select
Next intCnt
strLine = Replace(strLine, Chr(34), "")
arrLine(intRec) = strLine
intRec = intRec + 1
Loop
Close #intFile
Open strDstFile For Append As #intFile
For intCnt = 0 To UBound(arrLine)
Print #intFile, arrLine(intCnt)
Next
Close #intFile
End Sub

Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: VBA: "Split" bei gequoteten Werten
03.12.2005 09:09:02
Luschi
Hallo Erich,
gute Arbeit, konnte ich gleich für meine Belange nutzen. Habe die For-Schkeufe noch erweitert und wandle die Dezimalstelle in 1 Punkt um, damit beim Einlesen in Excel keine weiteren Probleme entstehen.
For intCnt = 1 To Len(strLine)
Select Case Mid(strLine, intCnt, 1)
Case Chr(34)
inQuote = Not inQuote
Case ","
If Not inQuote Then
Mid(strLine, intCnt, 1) = ";"
Else
Mid(strLine, intCnt, 1) = "."
End If
End Select
Next intCnt
Gruß von Luschi
aus klein-Paris
AW: VBA: "Split" bei gequoteten Werten
03.12.2005 09:29:02
Erich
Hallo Luschi,
die Kombination von Punkt als Dezimal- und Semikolon als Listentrenner ist wohl eher ungebräuchlich. Ich würde entweder
- Dezimaltrenner: Komma und Listentrenner: Semikolon (deutsch)
oder
- Dezimaltrenner: Punkt und Listentrenner: Komma (amerikanisch)
verwenden.
Noch eine Bemerkung zum Code:
Das "Preserve" beim Redim ist überflüssig (schadet aber auch nicht). Um ständiges Redimensionieren zu vermeiden, habe ich ja die Sätze zunächst einmal nur zählen lassen, um dann gleich endgültig dimensionieren zu können.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: VBA: "Split" bei gequoteten Werten
03.12.2005 09:41:52
Luschi
Hallo Erich,
da ich den Datenex- und -import in/aus Textdateien immer mit Vba mache, ist das Listentrennzeichen eigentlich egal. Mein Lieblingszeichen ist Folgendes: ¤
Und der Grund ist der: Zu DDR-Zeiten durfte auf den Tastaturen kein $-Zeichen stehen und deshalb hat man dieses (¤) hingepinselt. Da wir aber Drucker aus japan. Lizenz hatten, stand auf Papier dann wieder das $-Zeichen.
Gruß von Luschi
aus klein-Paris
PS: Dein Code kam gerade zur rechten Zeit und brauchte so mein Gehirnschmalz nicht zu bemühen.
vielen Dank
03.12.2005 10:46:39
Christian
Hallo Erich,
der Boolean-Schalter war der Trick, auf den ich nicht gekommen bin.
vielen Dank, du hast mir sehr geholfen
Gruß
Christian
Anzeige
AW: vielen Dank
03.12.2005 12:47:12
Unbekannter
Es haben 2 bei deinem Problem geholfen,nicht vergessen.

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige