Hallo,
ich versuche eine Datei zeilenweise einzulesen (Code siehe unten). Die Datei wird von einem Messgerät in einem proprietären Format (*.p2) erzeugt und scheint eine Textdatei zu sein, ist zumindest im Windos-Notepad problemlos zu öffnen. Der Dateiinhalt wird allerdings nur bis zum ersten Leerzeichen in der zweiten Zeile eingelesen.
Wenn ich die Datei aber im Notepad öffne und dort abspeichere, wird der Inhalt anschliessend korrekt zurückgegeben. Wenn ich die Datei per FileCopy kopiere und in *.txt umbenenne, werden die Leerzeichen in kleine Quadrate umgewandelt (die sich hier nicht hineinkopieren lassen). Ich darf also davon ausgehen, dass es sich um ein Zeichensatz-Problem handelt, oder?
Hat jemand einen Tipp, wie ich weiter vorgehen muss, um den Inhalt vollständig eingelesen zu bekommen?
fileNum% = Freefile()
Open FileName$ For Input As fileNum%
Do While Not Eof(fileNum%)
Line Input #fileNum%, txt$
mw$ =mw$ & Chr$(10) & txt$
Loop
Close fileNum%
Msgbox mw$
Manchmal hilft auch eine einfach Umleitung der Ausgabe in eine neue Datei: Type evtl. in Verbindung mit Mode
Vielleicht vor dem Einlesen noch eine kleine Batchdatei ausführen, die das erledigt
mode con: CP Select ....
type xy.p2 > xy.txt
Markus
... gibt's zwei Übersetzungen in meinem Fall - "Read The Fine Martin" + "Read The Fuckin Manual" ;)
Martin hat den Lösungshinweis und die Designer-Hilfe unter "Examples: Read method " die Vorgehensweise geliefert:
Ich öffne die Ursprungsdatei binär als Stream und schreibe sie neu als temporäre Datei ohne die Nullstrings, die ich per Open ... As... zeilenweise auslesen kann. Das sieht dann so aus:
Dim ws As New NotesUIWorkspace
Dim inPath As String, outPath As String
Dim session As New NotesSession
Dim inStream As NotesStream, outStream As NotesStream
Dim inBuff As Variant, outBuff() As Byte
FilePath = ws.OpenFileDialog(False ,"Messwerte importieren" , "Messdatei|*.p2|")
If Not(Isempty(FilePath)) Then
inPath = FilePath(0)
Else
Exit Sub
End If
outPath=Environ("temp")+"mw.tmp"
Set inStream = session.CreateStream
If Not inStream.Open(inPath, "binary") Then
Messagebox inPath,, "Open failed"
Exit Sub
End If
Set outStream = session.CreateStream
If Not outStream.Open(outPath, "binary") Then
Messagebox outPath,, "Open failed"
Exit Sub
End If
prevChar = True
Do
inBuff = inStream.Read(32767)
counter% = 0
Forall b In inBuff
If (b >0) Then
If Not prevChar Then
Redim Preserve outBuff(0 To counter%)
outBuff(counter%) = 32
counter% = counter% + 1
prevChar = True
End If
Redim Preserve outBuff(0 To counter%)
outBuff(counter%) = b
counter% = counter% + 1
Else
prevChar = False
End If
End Forall
Call outStream.Write(outBuff)
Loop Until inStream.IsEOS
Call inStream.Close
Call outStream.Close
fileNum% = Freefile()
Open outPath For Input As fileNum%
Do While Not Eof(fileNum%)
Line Input #1, InputStr$
If txt$<> "" Then
ln=Chr$(10)
Else
ln=""
End If
txt$= txt$ & ln & InputStr$
Loop
Close fileNum%
Kill outPath
Msgbox txt$
Danke Euch allen!
ich hätte noch folgenden Verbesserungsvorschlag:
ein "Redim Preserve outBuff(0 To counter%)" und noch dazu in der Schleife ist eine sehr teure Operation
Do
buf = inStream.Read(32767)
Forall b In buf
if b == 0 then b = 32 ' alle 0x00 durch Spaces ersetzen
end forall
Call outStream.Write(buf)
Loop Until inStream.IsEOS
obiger Code arbeitet inplace mit nur einem Puffer und ohne umkopieren. Allerdings entfernt er die 0-bytes nicht, sondern ersetzt sie durch Spaces. Dafür dürfte der code um einiges schneller sein.
Wenn man ohne Temp-Datei auskommen will, muss man wohl noch etwas Aufwand betreiben und in "buf" nach "\r" bzw. "\n" suchen.
Gruß
Roland