eine Zeile einer *.txt auslesen und übernehmen
Moderator: Moderatoren
Re: eine Zeile einer *.txt auslesen und übernehmen
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 ?
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
clag
nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Re: eine Zeile einer *.txt auslesen und übernehmen
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
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)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Re: eine Zeile einer *.txt auslesen und übernehmen
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 ?
schonmal Danke vorweg für mögliche Forschungsarbeit
PS Umlaute sind keine enthalten
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 ?
schonmal Danke vorweg für mögliche Forschungsarbeit

PS Umlaute sind keine enthalten
LG
clag
nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
clag
nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Re: eine Zeile einer *.txt auslesen und übernehmen
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
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)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Re: eine Zeile einer *.txt auslesen und übernehmen
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
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
clag
nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Re: eine Zeile einer *.txt auslesen und übernehmen
Hallo
Es dürften die ersten vier oder sechs Bytes am Anfang sein die du löschen musst.
Gruß Karo
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)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Re: eine Zeile einer *.txt auslesen und übernehmen
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
so'n Scheibenkleister ........
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
so'n Scheibenkleister ........
LG
clag
nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
clag
nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Re: eine Zeile einer *.txt auslesen und übernehmen
Aloha
Probier es mal hiermit:
Ich kann damit unter Windows XP, OOo 3.11 Deine beiden Beispieldateien problemlos auslesen.
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
Re: eine Zeile einer *.txt auslesen und übernehmen
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 ?
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
nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Re: eine Zeile einer *.txt auslesen und übernehmen
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
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
das gilt für Alle .....
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

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


das gilt für Alle .....
LG
clag
nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
clag
nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Re: eine Zeile einer *.txt auslesen und übernehmen
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.
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.
Re: eine Zeile einer *.txt auslesen und übernehmen
Hallo Allerseits....
@DPunch Danke für die Aufklärung
so und nun kommt es dicke
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.
@DPunch Danke für die Aufklärung
so und nun kommt es dicke

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
nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Re: eine Zeile einer *.txt auslesen und übernehmen
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.....
ist das, was ich da zusammen gebastelt habe akzeptabel (fehlerfreie Funktion)
oder sträubt sich da dem einen oder anderen sein BASIC-Haar ?
@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 ?
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.....

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
oder sträubt sich da dem einen oder anderen sein BASIC-Haar ?

@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
clag
nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Re: eine Zeile einer *.txt auslesen und übernehmen
Aloha

*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).
Nö, ist einwandfrei.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 ?

Der Aufbau istclag 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 ?
*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).
Re: eine Zeile einer *.txt auslesen und übernehmen
Hi DPunch,
Danke für deine ausführlich Antwort
das "znum as integer" hab ich gleich noch korrigiert.
so, nun ich habe fertig
Danke für deine ausführlich Antwort

das "znum as integer" hab ich gleich noch korrigiert.
so, nun ich habe fertig

LG
clag
nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
clag
nutzt: WinXP SP3 / AOO 4.1.10 / Firefox