Supportnet / Forum / Tabellenkalkulation
Problem beim Textfile per Makro einlesen
Frage
Hallo,
ich bin gerade dabei mir ein Makro zu schreiben, das mir spezielle Text-Files einliest.
Per:
[code]
...
Open Dateiname For Input As #1
...
Do While Not EOF(1)
...
Input #1, TMP
...[/code]
Nun ist dieses Textfile jedoch offensichtlich mittels Tabulatoren formatiert, beim Einlesen werden diese Tabulatoren jedoch innerhalb des Strings als Quadrate dargestellt.
Wie kann ich diese Tabulatoren innerhalb eines Strings (dort als Quadrat dargestellt) entsprechend zB per Mid - Fkt. abfragen?
Erstaunlicherweise werden Kommas gar nicht eingelesen sondern als Zeichen bzw. Zeilentrennung Interpretiert. Läßt sich das umgehen?
Besten Dank
[list] Primut[/list]
Antwort 1 von CaroS
Hallo Primut,
ich denke, was Du da verwendest ist die Input #-Anweisung. Schau Dir mal als Alternative die Input-Funktion und auch die Hilfe dazu an. Die funktioniert etwas anders. Man kann damit sehr gut Zeichen einzeln einlesen und ist von den Zeilen oder sonstigen Strukturen der einzulesenden Datei unabhängig.
Sub Datei_zeichenweise_einlesen()
Dim c1 As String, s As String, dateiname As String
dateiname = "D:\Daten\Dokumente und Einstellungen\...\Text.txt"
s = ""
Open dateiname For Input As #1
Do While Not EOF(1)
Rem ein einzelnes Zeichen in c1 einlesen
c1 = Input(1, #1)
Rem Prüfung und Verarbeitung von c1, z. B.
s = s & c1
Loop
Close #1
Rem MsgBox s, , "Fertig!"
End Sub
Hoffe es hilft.
Gruß,
CaroS
ich denke, was Du da verwendest ist die Input #-Anweisung. Schau Dir mal als Alternative die Input-Funktion und auch die Hilfe dazu an. Die funktioniert etwas anders. Man kann damit sehr gut Zeichen einzeln einlesen und ist von den Zeilen oder sonstigen Strukturen der einzulesenden Datei unabhängig.
Sub Datei_zeichenweise_einlesen()
Dim c1 As String, s As String, dateiname As String
dateiname = "D:\Daten\Dokumente und Einstellungen\...\Text.txt"
s = ""
Open dateiname For Input As #1
Do While Not EOF(1)
Rem ein einzelnes Zeichen in c1 einlesen
c1 = Input(1, #1)
Rem Prüfung und Verarbeitung von c1, z. B.
s = s & c1
Loop
Close #1
Rem MsgBox s, , "Fertig!"
End Sub
Hoffe es hilft.
Gruß,
CaroS
Antwort 2 von Primut
Hey,
wird wohl wie üblich wieder darauf hinauslaufen:
Probieren, Probieren, Probieren...
@CaroS , besten Dank, gute Probier-Idee! ;-))))
Gruß
wird wohl wie üblich wieder darauf hinauslaufen:
Probieren, Probieren, Probieren...
@CaroS , besten Dank, gute Probier-Idee! ;-))))
Gruß
- Primut
Antwort 3 von coros
Hallo Primut,
ich weiß jetzt nicht, ob ich mit meiner Lösungvorschlag in die richtige Richtung ziele,
aber bei den Quadraten wird es sich um Zeilenvorschubzeichen oder Wagenrücklaufzeichen handeln. Diese kannst Du z.B. mit der Inst-Anweisung abfragen. Also mit z.B. mit der Anweisung
oder mit
wird Dir der Wert zurückgegeben, an der sich dieses Zeichen befindet. Wenn man das Ganze in eine Schleife einbindet, kann man dann die Zeichen herauslöschen lassen. Anstelle der Konstanten "vbLf" und "vbCr" kannst Du auch die Chr-Funktion (Chr(10) oder Chr(13)) benutzen.
Eventuell hilft Dir das ja weiter.
MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
ich weiß jetzt nicht, ob ich mit meiner Lösungvorschlag in die richtige Richtung ziele,
aber bei den Quadraten wird es sich um Zeilenvorschubzeichen oder Wagenrücklaufzeichen handeln. Diese kannst Du z.B. mit der Inst-Anweisung abfragen. Also mit z.B. mit der Anweisung
InStr(Dein_Text, vbLf)
oder mit
InStr(Dein_Text, vbCr)wird Dir der Wert zurückgegeben, an der sich dieses Zeichen befindet. Wenn man das Ganze in eine Schleife einbindet, kann man dann die Zeichen herauslöschen lassen. Anstelle der Konstanten "vbLf" und "vbCr" kannst Du auch die Chr-Funktion (Chr(10) oder Chr(13)) benutzen.
Eventuell hilft Dir das ja weiter.
MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 4 von Primut
Hi Oliver,
auch wenn ich noch nicht fertig bin, war von der Sache her schon das, was ich suchte, die Abfrage dann allerdings mit der Variable
vBTab, die werden ja alle als Quadrat dargestellt.
Und mit dieser Variable funktioniert nur der binäre Vergleich, du hast also Recht gehabt.
Besten Gruß
auch wenn ich noch nicht fertig bin, war von der Sache her schon das, was ich suchte, die Abfrage dann allerdings mit der Variable
vBTab, die werden ja alle als Quadrat dargestellt.
Und mit dieser Variable funktioniert nur der binäre Vergleich, du hast also Recht gehabt.
Besten Gruß
- Primut
Antwort 5 von CaroS
Hallo, hier noch was zum ausprobieren und erweitern:
Sub Primuts_Datei_zeichenweise_einlesen()
Dim c1 As String, s As String, dateiname As String, Zeile() As String
Dim crlf As Boolean, z As Long
dateiname = "D:\Daten\ ... \Text.txt"
s = ""
z = 0
crlf = True
Open dateiname For Input As #1
Do While Not EOF(1)
c1 = Input(1, #1)
If Asc(c1) = 13 Or Asc(c1) = 10 Then
If Not crlf Then
crlf = True
z = z + 1
ReDim Preserve Zeile(z)
Zeile(z) = s & Chr(13)
s = ""
Else
crlf = False
End If
Else
If crlf Then
crlf = False
If Asc(c1) > 31 And Asc(c1) <= 128 Then s = s & c1
Else
If Asc(c1) > 31 And Asc(c1) <= 128 Then s = s & c1
End If
End If
Loop
Close #1
z = z + 1
ReDim Preserve Zeile(z)
Zeile(z) = s
For z = LBound(Zeile()) To UBound(Zeile())
MsgBox Zeile(z), , "Zeile(" & CStr(z) & ")"
Next z
End Sub
Dazu am besten eine relativ kleine Textdatei verwenden, das Prinzip ist ja nach wenigen Zeichen/Zeilen klar. Der Code ist im Moment speziell darauf zugeschnitten, dass die Zeilen der Datei mit vbCR und vbLF (=Chr(13)&Chr(10)) enden. Lässt nur Zeichen zwischen ASCII-32 und ASCII-128 durch, aber das kann man ja leicht erweitern.
Gute-Nacht-Gruß,
CaroS
Sub Primuts_Datei_zeichenweise_einlesen()
Dim c1 As String, s As String, dateiname As String, Zeile() As String
Dim crlf As Boolean, z As Long
dateiname = "D:\Daten\ ... \Text.txt"
s = ""
z = 0
crlf = True
Open dateiname For Input As #1
Do While Not EOF(1)
c1 = Input(1, #1)
If Asc(c1) = 13 Or Asc(c1) = 10 Then
If Not crlf Then
crlf = True
z = z + 1
ReDim Preserve Zeile(z)
Zeile(z) = s & Chr(13)
s = ""
Else
crlf = False
End If
Else
If crlf Then
crlf = False
If Asc(c1) > 31 And Asc(c1) <= 128 Then s = s & c1
Else
If Asc(c1) > 31 And Asc(c1) <= 128 Then s = s & c1
End If
End If
Loop
Close #1
z = z + 1
ReDim Preserve Zeile(z)
Zeile(z) = s
For z = LBound(Zeile()) To UBound(Zeile())
MsgBox Zeile(z), , "Zeile(" & CStr(z) & ")"
Next z
End Sub
Dazu am besten eine relativ kleine Textdatei verwenden, das Prinzip ist ja nach wenigen Zeichen/Zeilen klar. Der Code ist im Moment speziell darauf zugeschnitten, dass die Zeilen der Datei mit vbCR und vbLF (=Chr(13)&Chr(10)) enden. Lässt nur Zeichen zwischen ASCII-32 und ASCII-128 durch, aber das kann man ja leicht erweitern.
Gute-Nacht-Gruß,
CaroS

