Hi,
ich würde gerne aus einer Textdatei erst ab einem bestimmten Zeichen den Text auslesen.
Hintergrund ist der, dass ich etwas in eine Textdatei schreibe, anschließend muss ich 2 Zeilen zurückspringen und dort was reinschreiben.
Jetzt ist es leider so, dass durch das zurückspringen, alles was unterhalb steht überschrieben wird.
Deshalb dachte ich, wenn ich ab der Stelle ab der ich zurück gesprungen bin alles aus der Textdatei auslesen kann, dann kann ich das ja einfach wieder unten anfügen.
Alternativ würde ich auch eine Lösung begrüßen, bei der der neue Text den Text unterhalb "vor sich her schiebt", also dass der untere Text nicht überschrieben wird.
Ist sowas möglich?
Liebe Grüße
aus Textdatei erst aber bestimmtem Zeichen auslesen
Moderator: Moderatoren
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9345
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 100 Mal
- Danksagung erhalten: 359 Mal
- Kontaktdaten:
Re: aus Textdatei erst aber bestimmtem Zeichen auslesen
Code: Alles auswählen
cText := Left(cText,nLesePosition-1)+cNeuerText+Substr(cText,nLesePosition)
Herzlich,
Tom
Tom
- brandelh
- Foren-Moderator
- Beiträge: 15689
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: aus Textdatei erst aber bestimmtem Zeichen auslesen
Grundsätzlich kann man in einer Textdatei (fopen(), fwrite() etc.) nichts einfügen, sondern nur neu schreiben oder anhängen.
ABER so macht man das auch nicht
Entweder man liest sie per MEMOREAD() ein, ändert im String was man will und schreibt mit lMemoWrite() von ot4xb oder mit Str2Disk() den neuen Inhalt weg.
http://www.xbaseforum.de/viewtopic.php?f=16&t=1811
MemoWrit() von Xbase++ ist NICHT geeignet, da es ein chr(26) anhängt.
Wenn du die Datei immer zeilenweise bearbeiten willst, ist das Umschaufeln in ein Array sinnvoll, da man da Zeilen entfernen und einfügen kann.
Nach der Bearbeitung wird dann das Array wieder weggeschrieben:
http://www.xbaseforum.de/viewtopic.php?f=16&t=4268
Fürs Einlesen einer TXT Datei in ein Array nutze ich diese Funktion:
Du kannst dir die funktion natürlich mit fopen(), fread() und fwrite() auch selbst bauen. Hierzu zunächst den Rest einlesen, den neuen Text mit dem Rest vereinen und an der gewünschten Stelle mit dem Rest zusammen wieder wegschreiben (dabei wird der alte Inhalt überschrieben), wenn du aber die Datei kürzen willst, dann weiß ich nicht ob das so funktioniert.
Aus Geschwindigkeitsgründen ist memoread() und lMemoWrite() / String2Disk() weit überlegen, da es die Platten nur kurz nutzt und von der Bedienung einfacher ist.
Strings von vielen MB sind ab WinNT kein Problem mehr, solange genug RAM im Rechner ist.
ABER so macht man das auch nicht
Entweder man liest sie per MEMOREAD() ein, ändert im String was man will und schreibt mit lMemoWrite() von ot4xb oder mit Str2Disk() den neuen Inhalt weg.
Code: Alles auswählen
*---------------------------------------------------------------------------------------------
function Str2Disk(cFile,cTxt) // memowrit() fügt ein chr(26) an die Datei an, was stört !
local nResult, nHandle, nByte
nResult := 0 // wird schon alles gut gehen ...
nHandle := FCreate(cFile)
if nHandle = -1
nResult := FError()
else
nByte := FWrite( nHandle, cTxt )
if len(cTxt) # nByte
nResult := FError()
endif
endif
FClose(nHandle)
return nResult
MemoWrit() von Xbase++ ist NICHT geeignet, da es ein chr(26) anhängt.
Wenn du die Datei immer zeilenweise bearbeiten willst, ist das Umschaufeln in ein Array sinnvoll, da man da Zeilen entfernen und einfügen kann.
Nach der Bearbeitung wird dann das Array wieder weggeschrieben:
Code: Alles auswählen
set alternate to TextDatei.txt
set alternate on
set console off // bei GUI sehr wichtig
aeval(aZeilen,{|cZeile| qout(cZeile)})
set alternate to
oder
cTxt := ""
aeval(aZeilen,{|cZeile| cTxt += cZeile + chr(13) + chr(10) })
lMemoWrite("TextDatei.txt",cTxt)
cTxt := NIL
Fürs Einlesen einer TXT Datei in ein Array nutze ich diese Funktion:
Code: Alles auswählen
*-------------------------------------------------------------------------------
FUNCTION TxtFile2Array(cDateiName,cConvert) // TXT einlesen und zeilenweise in Array einlesen
// cConvert: NIL / empty - nichts tun
// O2A - Oem 2 Ansi
// A2O - Ansi 2 Oem
local cDateiInhalt, aZeilen := {}, nVon, nBis, cTxt
DEFAULT cConvert to ""
nVon := 1
nBis := 0
if file(cDateiName)
cDateiInhalt := memoread(cDateiName)
if ! empty(cDateiInhalt)
cConvert := upper(alltrim(cConvert))
do case
case cConvert == "O2A"
cDateiInhalt := ConvToAnsiCP(cDateiInhalt)
case cConvert == "A2O"
cDateiInhalt := ConvToOemCP(cDateiInhalt)
endcase
do while .t.
nBis := at(CRLF,cDateiInhalt,nVon)
if nBis = 0 // Ende der Datei wurde erreicht, letzten Satz nicht vergessen
cTxt := substr(cDateiInhalt,nVon)
nVon := len(cDateiInhalt)+1
else
cTxt := substr(cDateiInhalt,nVon,nBis-nVon)
nVon := nBis+2
endif
cTxt := strTran(cTxt,CRLF,"") // entferne die CRLF am Zeilenende
aadd(aZeilen,cTxt)
if nVon > len(cDateiInhalt)
exit
endif
enddo
endif
endif
return aZeilen
Aus Geschwindigkeitsgründen ist memoread() und lMemoWrite() / String2Disk() weit überlegen, da es die Platten nur kurz nutzt und von der Bedienung einfacher ist.
Strings von vielen MB sind ab WinNT kein Problem mehr, solange genug RAM im Rechner ist.
Gruß
Hubert
Hubert
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9345
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 100 Mal
- Danksagung erhalten: 359 Mal
- Kontaktdaten:
Re: aus Textdatei erst aber bestimmtem Zeichen auslesen
Je nach Dateigröße würde ich einfach mit FileStr() und StrFile() aus den Tools arbeiten. Wenn die Datei nicht gerade mehrere GB groß ist, spielt das auch keine Rolle im Hinblick auf die Performance:
Code: Alles auswählen
cText := FileStr(<cDateiName>)
cText := Left(cText,nLesePosition-1)+cNeuerText+Substr(cText,nLesePosition)
StrFile(cText,<cDateiName>,.T.)
Herzlich,
Tom
Tom
- brandelh
- Foren-Moderator
- Beiträge: 15689
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: aus Textdatei erst aber bestimmtem Zeichen auslesen
Wenn man die XbToolsIII hat ... alle Funktionen die die Datei am Stück einlesen und wegschreiben sind gleichwertig.
Wie man den String zerlegt hat TOM gezeigt, aber bei neuen Zeilen muss man beachten, dass man nicht nur den TEXT sondern am Ende auch noch die Zeilenschaltung (chr(13)+chr(10)) angängt, bevor der Rest kommt ...
Wie man den String zerlegt hat TOM gezeigt, aber bei neuen Zeilen muss man beachten, dass man nicht nur den TEXT sondern am Ende auch noch die Zeilenschaltung (chr(13)+chr(10)) angängt, bevor der Rest kommt ...
Gruß
Hubert
Hubert