Autor Thema: Problem mit Line Input  (Gelesen 3370 mal)

Offline jo@chim

  • Aktives Mitglied
  • ***
  • Beiträge: 246
  • Geschlecht: Männlich
Problem mit Line Input
« am: 01.12.10 - 16:26:25 »
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?


Code
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$
Gruss,
Achim
-------------------
IBM Certified Advanced Application Developer Lotus Notes and Domino 7

Offline Pyewacket

  • Senior Mitglied
  • ****
  • Beiträge: 310
  • Geschlecht: Männlich
Re: Problem mit Line Input
« Antwort #1 am: 01.12.10 - 17:13:09 »
Hallo Achim,

ist das Leerzeichen eventuell gar keines sondern ein ^Z welches als Dateiende erkannt wird?
Hast du eine Dokumentation zu dem Dateiformat?
Schau dir die Datei mal mit einem Fileviewer als Hexdump an, dann siehst du was die kleinen Quadrate wirklich darstellen.

Gruss
 Peter
ATOS.org - Feel the music!

Offline jo@chim

  • Aktives Mitglied
  • ***
  • Beiträge: 246
  • Geschlecht: Männlich
Re: Problem mit Line Input
« Antwort #2 am: 02.12.10 - 07:52:17 »
Zitat
ist das Leerzeichen eventuell gar keines sondern ein ^Z welches als Dateiende erkannt wird?
Irgend so etwas in der Art wohl (Dateiende eher nicht, weil ja jede Zeile bis zum "Leerzeichen" gelesen wird).
Dokumentation oder Support ist Fehlanzeige.

Wie gehe ich das Problem an, die Sonderzeichen in Leerzeichen umzuwandeln bzw. einen Abbruch an der Stelle zu vermeiden?
Gruss,
Achim
-------------------
IBM Certified Advanced Application Developer Lotus Notes and Domino 7

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: Problem mit Line Input
« Antwort #3 am: 02.12.10 - 09:33:50 »
Du könntest versuchen die Datei mittels eines NotesStream einzulesen. Allerdings unterstützt dieser nicht das Lesen einer Zeile (also bis zum \n)

Du könntest aber auch mal die Datei mit einem Hex-Editor öffnen um das Zeichen das Problem macht, zu analysieren.

Gruß
Roland
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

BigWim

  • Gast
Re: Problem mit Line Input
« Antwort #4 am: 02.12.10 - 09:54:24 »
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

Code
mode con: CP Select ....
type xy.p2 > xy.txt

Markus

Offline jo@chim

  • Aktives Mitglied
  • ***
  • Beiträge: 246
  • Geschlecht: Männlich
Re: Problem mit Line Input
« Antwort #5 am: 02.12.10 - 10:42:25 »
@pram:
Per stream.Open / stream.readtext() gibt es denselben Effekt.
Das "Leerzeichen" wird im Hex-Editor als 00 angezeigt. Wenn ich die Datei im Notepad speichere, wird dieses Zeichen in 20 umgewandelt - dann funktioniert der Import.

@BigWim:
Welche Codepage muss ich denn auswählen?
Gruss,
Achim
-------------------
IBM Certified Advanced Application Developer Lotus Notes and Domino 7

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: Problem mit Line Input
« Antwort #6 am: 02.12.10 - 10:55:37 »
Also ein nullterminierter String. Damit kommt readText scheinbar auch nicht klar.
Du könntest Notessteam.read versuchen. Dieser liefert dir aber ein Byte-Array
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline m3

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.102
  • Geschlecht: Männlich
  • Non ex transverso sed deorsum!
    • leyrers online pamphlet
Re: Problem mit Line Input
« Antwort #7 am: 02.12.10 - 10:59:02 »
Oh. Schön! "00" ist in vielen Sprachen/Systemen, die auf C basieren, der "End of String" Character.

Da hilft
a) dem Messgerät beibringen, kein "00" zu schreiben
b) das File im Binary Mode öffnen und "00" durch " " ersetzen
c) über einen NotesStream Byteweise lesen und "00" durch " " ersetzen

HTH
m³ aka. Martin -- leyrers online pamphlet | LEYON - All things Lotus (IBM Collaborations Solutions)

All programs evolve until they can send email.
Except Microsoft Exchange.
    - Memorable Quotes from Alt.Sysadmin.Recovery

"Lotus Notes ist wie ein Badezimmer, geht ohne Kacheln, aber nicht so gut." -- Peter Klett

"If there isn't at least a handful of solutions for any given problem, it isn't IBM"™ - @notessensai

BigWim

  • Gast
Re: Problem mit Line Input
« Antwort #8 am: 02.12.10 - 11:34:55 »
Zitat
Welche Codepage muss ich denn auswählen?

Ich hätte es erst einmal ohne eine Angabe probiert, also nur mit Type.
Der Verweis auf die Codepage war als Hinweis gedacht, vielleicht gibt es ja da etwas spezielles. Denn ich gehe mal davon aus, dass "wir" nicht die ersten sind, die auf dieses Problem stoßen ;-)

Vielleicht hilft ja das weiter.
http://www.uwe-sieber.de/codepage.html
http://en.wikipedia.org/wiki/Code_page

Markus

Offline jo@chim

  • Aktives Mitglied
  • ***
  • Beiträge: 246
  • Geschlecht: Männlich
Für RTFM...
« Antwort #9 am: 02.12.10 - 13:08:07 »
... 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:

Code
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!
Gruss,
Achim
-------------------
IBM Certified Advanced Application Developer Lotus Notes and Domino 7

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: Problem mit Line Input
« Antwort #10 am: 02.12.10 - 16:23:39 »
ich hätte noch folgenden Verbesserungsvorschlag:
ein "Redim Preserve outBuff(0 To counter%)" und noch dazu in der Schleife ist eine sehr teure Operation
Code
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
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz