eine Zeile einer *.txt auslesen und übernehmen

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: eine Zeile einer *.txt auslesen und übernehmen

Beitrag von clag »

Hallo Karo und natürlich auch all die Anderen hier,

deine für mich gestrickte Funktion "DRITTE_ZEILE" erweist mir täglich sehr hilfreich Dienste

allerdings gab es jetzt einige Mal das Problem, dass der Funktionscode partout nicht die Zeile auslesen wollte (es wurde kein Text ausgelesen)
obwohl die Zeile existierte und alle Angaben korrekt waren.

Nun bin ich dahinter gekommen, dass das passiert wenn es *.txt Dateien sind, die nicht im ANSI/ASCII sondern im "Unicode" gespeichert sind
aber aber auch dann nicht bei allen Dateien dieses Typs. Ich habe aber noch nicht erkennen können woran es genau liegt

Aber nun meine Frage kannst du/man an dem Funktionscode etwas ändern oder hinzufügen (Parameter),
so dass Unicode ohne Aussetzer gelesen wird ?
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Karolus
********
Beiträge: 7532
Registriert: Mo, 02.01.2006 19:48

Re: eine Zeile einer *.txt auslesen und übernehmen

Beitrag von Karolus »

Hallo
Der Fehler tritt wahrscheinlich dann auf wenn im auszulesenden Text Umlaute auftauchen, ich weiss jetzt nicht aus dem Stehgreif wie man in Basic die Zeichencodierung von Textdateien auslesen kann.

Gruß Karo
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: eine Zeile einer *.txt auslesen und übernehmen

Beitrag von clag »

Hi Leutz,

falls da nochmal jemand Zeit findet lade ich mal zwei Dateien hoch eine im ANSI und eine im UNI Code
die Datei im UNIcode lässt sich nicht mit der Funktion von Karo auslesen.
Mich würde interessieren kann das BASIC schlicht keine solche Datei lesen oder ist die Datei in irgend einer Hinsicht fehlerhaft ?
ANSI&UNIcode.txt.rar
(1011 Bytes) 72-mal heruntergeladen
schonmal Danke vorweg für mögliche Forschungsarbeit :D

PS Umlaute sind keine enthalten
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Karolus
********
Beiträge: 7532
Registriert: Mo, 02.01.2006 19:48

Re: eine Zeile einer *.txt auslesen und übernehmen

Beitrag von Karolus »

Hallo
Die Unicode.txt enthält am Anfang meines ungesicherten Wissens nach eine sogenannte BOM (ByteOrderMark) das sind Zeichen die die Datei als UTF-8 ..-16..-32 ect. markieren ( vor allem von Windows ? )
Mehr ungesicherte Weisheiten will ich jetzt nicht von mir geben, ausser :
mit
→ sed -e '1{s/^..//g;}' < Unicode.txt > Unicodeout.txt
auf der Kommandozeile, gelingt es die beiden störenden Zeichen zu entfernen.

Gruß Karo
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: eine Zeile einer *.txt auslesen und übernehmen

Beitrag von clag »

Hallo Karolus,

mir scheint, als Windowsianer (XP-SP3) bin ich mal wieder gekniffen...

wenn ich mit einem HexEditor die beiden ersten Byte auf 00 setzte oder auch lösche
mag mein Calc 3.2.1 die Datei immer noch nicht lesen bzw die Zeile finden

die Datei an sich wird gefunden,
denn es wird kein Fehler ausgegeben wie bei einer fehlenden Datei,
aber die Zeile bzw den Text darin findet es immer noch nicht...

speichere ich die Datei als ANSI ist sofort alles in Butter,
aber die weiter hinten folgenden UNIcode Zeichen sind dann natürlich "wech"

hmm
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Karolus
********
Beiträge: 7532
Registriert: Mo, 02.01.2006 19:48

Re: eine Zeile einer *.txt auslesen und übernehmen

Beitrag von Karolus »

Hallo
Es dürften die ersten vier oder sechs Bytes am Anfang sein die du löschen musst.

Gruß Karo
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: eine Zeile einer *.txt auslesen und übernehmen

Beitrag von clag »

Hallo Karolus,

nach dem ich mich noch den halben Nachmittag mit diesem Problem beschäftigt und "rum probiert" habe,
denke ich es ist ein Bug in OOo/Basis .

Denn das, woran das auslesen der Zeilen scheitert ist das UNIcode "NeueZeileZeichen"
wie es vom WindowsNotepad korrekt generiert wird als "CR+LF: CR (U+000D) followed by LF (U+000A)"
aber OOo kann es offenbar nicht richtig auswerten.

Denn die gleiche Datei im UNIX Format gespeichert nur mit "LF: Line Feed, U+000A"
kann von OOo/WIN gelesen werden....

http://en.wikipedia.org/wiki/Newline
UNIcode-ärger_.jpg
UNIcode-ärger_.jpg (77.49 KiB) 2628 mal betrachtet
so'n Scheibenkleister ........
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: eine Zeile einer *.txt auslesen und übernehmen

Beitrag von DPunch »

Aloha

Probier es mal hiermit:

Code: Alles auswählen

function dritte_zeile( pfad as string) as string
	FileName = ConvertFromURL(pfad)
	n = FreeFile
	nCurrentLine = 1
	On Local Error Goto FileOpenError
	Open FileName For Input As #n
	Do While NOT EOF(n) AND nCurrentLine < 4
		Input #n, s
		nCurrentLine = nCurrentLine + 1
	Loop
	If nCurrentLine = 4 Then 
		dritte_zeile = s
	Else
		dritte_zeile = "###NO_DATA###"
	End If
	Close #n

	Exit Function
	FileOpenError:
	dritte_zeile = "###FILE_OPEN_ERROR###"
end function
Ich kann damit unter Windows XP, OOo 3.11 Deine beiden Beispieldateien problemlos auslesen.
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: eine Zeile einer *.txt auslesen und übernehmen

Beitrag von clag »

Hallo DPunch,

erstmal Danke,
habe deinen Vorschlage natürlich gleich ausprobiert

leider gibt es hier bei mir eine BASIC Laufzeitfehler Meldung "Argument ist nicht optional" ??? für beide Dateien.

Ich habe deinen code zusätzlich in das Modul mit aufgenommen und in "dritte_zeile_lesen" umbenannt
damit es nicht mit Karos gleichnamigen Code kollidiert

in der Zelle steht dann zB =DRITTE_ZEILE_LESEN(E11) aber außer der Fehlermeldung tut sich nichts erkennbares ??

muss ich noch irgend etwas anderes berücksichtigen ?
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: eine Zeile einer *.txt auslesen und übernehmen

Beitrag von clag »

Hallo DPunch,

habe gerade bemerkt das ich ein paar mal umbenennen muss der Name taucht in der Funktion noch einige mal auf
nachdem ich jetzt alle geändert habe funktioniert es jetzt auch hier mit beiden bzw allen Testdateien die ich hier habe :D

stellt sich mir die Frage was ist der Grund,
dass dein Code mit der Datei UNIcode Datei umgehen kann und der von Karo nicht ?

und ganz herzlichen Dank für die Hilfe und Unterstützung :D :D
das gilt für Alle .....
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: eine Zeile einer *.txt auslesen und übernehmen

Beitrag von DPunch »

Aloha

Das wird mit der Leseweise von "Line Input" vs "Input" zu tun haben.

Wie Du schon festgestellt hast, funktioniert alles, wenn Du *nur* den Linefeed hast, aber nicht, wenn Du Linefeed + Carriage Return in der Datei vorliegen hast.
Das Problem bei Karos Code war schlichtweg, dass sowohl der Linefeed, als auch der Carriage Return als neue Zeile angesehen wurden, weshalb Du leere Ergebnisse gekriegt hast, wenn der Cursor gerade hinter dem Carriage Return gelandet war -> neue Zeile für den Input Stream -> die neue Zeile enthält nur den Linefeed -> leere Zeile. Und genau diese leere Zeile hast Du geliefert gekriegt.
Offensichtlich erkennt ein einfaches "Input" diese Zusammensetzung, das Stichwort "Line" reagiert aber auf beide Steuerzeichen.
(Kannst Du ja mal testen, indem Du z.B. jede einzelne eingelesene Zeile mit Karos Code ausgeben lässt)

Zurückzuführen ist das wohl darauf, dass die Anfänge unter Linux und deshalb ohne das CR liegen, aber ich weiss es ehrlich gesagt auch nicht genau.
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: eine Zeile einer *.txt auslesen und übernehmen

Beitrag von clag »

Hallo Allerseits....

@DPunch Danke für die Aufklärung


so und nun kommt es dicke :lol:

da ich diese Funktion für ausgesprochen nützlich halte und zwar nicht nur für mich
habe ich noch einen Wunsch an die Könner, damit man diese Funktion universeller einsetzen kann.

die Zeilennummer als einen Parameter übergeben also zB so =ZEILE_LESEN("Pfad\Datei";"zeile")

dann könnte man diese Funktion doch ganz universell einsetzen, das fände ich jedenfalls sehr hilfreich.
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: eine Zeile einer *.txt auslesen und übernehmen

Beitrag von clag »

Hi Leutz,

habe mal geschaut was man so alles bei Suche "function" findet und ob ich da was abgucken kann

das mit dem Parameter für die Zeilenangabe schien mir recht simpel einfach an der Stelle eine Variable benennen !?
habe jetzt das Makro von DPunch so abgeändert und scheint sogar soweit zu funktionieren..... 8)

Code: Alles auswählen

   function txt_zeile( pfad as string, znum as integer ) as string
       FileName = ConvertFromURL(pfad)
       n = FreeFile
       nCurrentLine = 1
       On Local Error Goto FileOpenError
       Open FileName For Input As #n
       Do While NOT EOF(n) AND nCurrentLine < znum+1
          Input #n, s
          nCurrentLine = nCurrentLine + 1
       Loop
       If nCurrentLine = znum+1 Then
          txt_zeile = s
       Else
          txt_zeile = "###NO_DATA###"
       End If
       Close #n
       Exit Function
       FileOpenError:
       txt_zeile = "###FILE_OPEN_ERROR###"
    end function
ist das, was ich da zusammen gebastelt habe akzeptabel (fehlerfreie Funktion)
oder sträubt sich da dem einen oder anderen sein BASIC-Haar ? :shock:

@DPunch
welchen Grund hat es das du in der ersten Zeile zweimal "as string" geschrieben hast
(es scheint auch nur mit einem dem innerhalb der () zu funktionieren ?
Zuletzt geändert von clag am Di, 22.06.2010 15:59, insgesamt 1-mal geändert.
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: eine Zeile einer *.txt auslesen und übernehmen

Beitrag von DPunch »

Aloha
clag hat geschrieben:ist das, was ich da zusammen gebastelt habe akzeptabel (fehlerfreie Funktion)
oder sträubt sich da dem einen oder anderen sein BASIC-Haar ? :shock:
Nö, ist einwandfrei. ;)
clag hat geschrieben:welchen Grund hat es das du in der ersten Zeile zweimal "as string" geschrieben hast
(es scheint auch nur mit einem dem innerhalb der () zu funktionieren ?
Der Aufbau ist
*Funktionsname* (*Parameter1* AS *Typ des Parameters*,*Parameter2* AS *Typ des Parameters*,etc) AS *Rückgabetyp der Funktion*

Heisst:
Die Deklaration "AS String" in der Klammer heisst, dass der erste Parameter, der der Funktion übergeben wird (in Deinem Fall der Pfad) vom Typ String sein muss.
Analog dazu würde Deine Funktion "sauber" programmiert folgende Deklaration haben:

function txt_zeile( pfad as string,znum as integer) as string

Deine Funktion erwartet dann als ersten Parameter einen String, als zweiten Parameter einen Integer. Zurückgegeben wird ein String (nämlich entweder eine der Fehlermeldungen oder eben die entsprechende Zeile aus der ausgelesenen Datei).
Lässt Du die Deklarationen komplett weg, wird automatisch der Typ "Variant" angenommen, was jeder beliebige Datentyp sein kann. Im Sinne der "sauberen" Programmierung sollte man sowas aber auf jeden Fall vermeiden, wenn man genau weiss, welche Datentypen übergeben und zurückgeliefert werden (sollen).
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: eine Zeile einer *.txt auslesen und übernehmen

Beitrag von clag »

Hi DPunch,

Danke für deine ausführlich Antwort :)

das "znum as integer" hab ich gleich noch korrigiert.

so, nun ich habe fertig :D
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Antworten