Autor Thema: Textdatei importieren - wieder mal...  (Gelesen 2521 mal)

Offline FrankLU

  • Aktives Mitglied
  • ***
  • Beiträge: 116
  • Geschlecht: Männlich
Textdatei importieren - wieder mal...
« am: 26.03.10 - 13:00:31 »
Hallo!

Ich habe eine Text-Datei, aus der ich eine Notes DB machen will. Die Informationen sind in Spalten fester Breite definiert, aber nicht alle Spalten enthalten Werte oder sind mit der maximalen Anzahl an Zeichen gefüllt. Da es keine Trennzeichen gibt, bedeutet das, dass zwischen den einzelnen Informationen der Felder mal mehr mal weniger Leerzeichen stehen.

Vier Zeilen aus der zu importierenden Text-Datei:

4T A02.-    Sonstige Salmonelleninfektionen
4I          Inkl.:   Infektion oder Lebensmittelvergiftung durch Salmonellen
                       außer durch Salmonella typhi und Salmonella paratyphi
LZ


Per Schaltfläche soll der Import starten.

Ich habe mir einen Type definiert, über die ich beim Lesen füllen will. Leider funktioniert das nicht so, wie ich mir das vorstelle. Im unten gegebenen Code habe ich nur das Lesen getest. Das funktionier, liefert aber Mist. Die Verarbeitung habe ich weggelassen.

Code
(Declarations)
Type ICD
	Sp1 As String *1
	Sp2 As String *1
	Sp3 As String *1
	Sp4 As String *9
	Sp5 As String *68
End Type

(Click)
Sub Click(Source As Button)
	Dim session As New NotesSession
	Dim ws As New NotesUIWorkspace
	Dim db As NotesDatabase
	Dim doc As NotesDocument
	Dim sFilename As Variant
	Dim fileNum As Integer
	Dim recLen As Integer
	Dim recCount As Long
	Dim Eingabe As ICD
	
	Set db = session.CurrentDatabase
	
	sFilename = ws.OpenFileDialog( False, "ICD - Code Import", "Textdatei|*.txt", "C:\Temp\")
	recLen = Len(Eingabe)
	
	If  Isempty(sFilename) Then
		Exit Sub
	End If
	
	fileNum% = Freefile()
	
	Open sFilename(0) For Random As fileNum Len=recLen
	
	recCount = 1
	
	Do While Not Eof(fileNum%)
		Get #filenum, recCount, Eingabe
		recCount = recCount + 1
	Loop
	Close #filenum
End Sub

Obwohl Type ICD nur 80 Stellen definiert, kommt LEN auf 160 Stellen.

In der Hilfe zu "Random" ist dann folgendes zu lesen:

Zitat
User-defined types can be used to define compound records.
For example:
Type emploRec
   id As Integer             ' Integers are 2 bytes long
   salary As Currency        ' Currency is 8 bytes
   hireDate As Double        ' Dates are also 8 bytes
   lastName As String * 15   ' Fixed-length string of 30 bytes
   firstName As String * 15  ' Fixed-length string of 30 bytes
End Type

The length of a type can be determined at run time using the Len function.
For example, this record is 78 bytes long, so supply Len = 78 in the Open statement.

In der Hilfe gehen irgendwie die Begriffe "Byte" und "Character" durcheinander. In der Hilfe zu "String [* num]" steht num für die Anzahl der Character. In der Hilfe zu "Len function" steht ebenfalls, dass die Anzahl der Characters zurückgegeben wird. Oben nun steht "String*15 = 30 Bytes. Wie geht das denn? Außerdem dachte ich seit 30 Jahren, dass in Deutschland ein Byte = ein Character ist.  ;)

Aber wie dem auch sei: Wenn dann ein Datensatz eingelesen wird, kann man im Debugger erkennen, dass jedes Feld von Type mit der richtigen Anzahl an Zeichen gefüllt ist. Aber es sind nur nicht-darstellbare Zeichen (Kästchen) zu erkennen, keine lesbaren Zeichen (siehe Debugger-Bild; ich hoffe, man kann was erkennen).

Ich könnte auch mit "Line Input" arbeiten, muss dann aber den eingelesenen String mit der MID function "zerpflücken". Da ich in Abhängigkeit der Werte an den Stellen 1 und 2 evtl. Sätze nachlesen muss, die dann aber zum selben Notes Dokument gehören, müsste ich den Code fehrfach einfügen oder in eine eigene Funktion packen, die ich dann immer aufrufen müsste. Ich wollte diese ganzen Codezeilen und Sprünge vermeiden.

Es kann doch wohl nicht so schwer sein, einen einfachen Text mit einer selbstdefinierten Struktur (Type) einzulesen...   >:(

Vielen Dank schon mal vorab.  :)

Edit:
Ich habe den Screenshot etwas verkleinert. Mehr ging leider nicht, sonst wäre die Lesbarkeit verloren gegangen.
Axel
« Letzte Änderung: 26.03.10 - 19:57:37 von Axel »
Frank Lohöfer
MD Medicus Holding GmbH
Client (User): 12.0.1
Client (Admin): 12.0.1
Server: 9.0 auf Linux

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: Textdatei importieren - wieder mal...
« Antwort #1 am: 26.03.10 - 13:13:56 »
1) Ginge der Screenshot bitte etwas kleiner? Danke!

2) Zeichen == Byte gilt spätestens seit UTF nicht mehr.

3) Du möchtest ev. einen MIMECharsetName beim Open angeben.
Aus der Designer-Hilfe:
Zitat
Designates the character set to use for sequential file I/O. If no character set is provided, file I/O is done in the platform code page


P.S.: Ad (3) Der gepostete Code stimmt nicht mit dem Screenshot überein. (3) bezieht sich daher auf den Code,  nicht auf den im Screenshot abgebildeten Code.
« Letzte Änderung: 26.03.10 - 13:18:37 von m3 »
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

Offline FrankLU

  • Aktives Mitglied
  • ***
  • Beiträge: 116
  • Geschlecht: Männlich
Re: Textdatei importieren - wieder mal...
« Antwort #2 am: 29.03.10 - 12:25:35 »
Hallo M3!

Danke für's verkleinern des Screenshots. Werde ihn das nächste Mal keliner machen. :-)

Der Screenshot stimmte schon mit dem zitierten Code überein, außer, dass im Screenshot beim Open-Befehl ein Charset = "uft-8" auskommentiert war.

Die habe ich nun mal aktiviert, habe auch alle anderen, mir sinnvollen Sets ausprobiert, auch in unterschiedlichen Schreibweise. Leider alles ohne Erfolg. MS Word meldet, dass es sich bei der zu importierenden Datei auch wirklich um einen UTF-8-Text handelt (richtiges Vorschaubild) und bestätigt damit die Angaben des Erstellers der Textdatei. Corels WordPerfect schafft den Textimport allerdings mit keinem Importfilter.

Ich gebe es jetzt auf und verwende Line Input und die MID function. Das klappt anstandslos, ohne dass ich mir über Bytes, Characters und Charactersets Gedanken machen muss. :-) Manchmal wünschte ich mir den alten Mainframe mit seinem EBCDI-Code zurück...

Wenn jemand doch einen funktionierenden Textimport hat, dann bitte melden.  ;) Ansonsten danke ich für die Unterstützung!

Grüße aus der Pfalz!
Frank
Frank Lohöfer
MD Medicus Holding GmbH
Client (User): 12.0.1
Client (Admin): 12.0.1
Server: 9.0 auf Linux

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz