aus Textdatei erst aber bestimmtem Zeichen auslesen

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
Benz
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 440
Registriert: Mo, 30. Mai 2011 15:06
Danksagung erhalten: 1 Mal

aus Textdatei erst aber bestimmtem Zeichen auslesen

Beitrag von Benz »

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
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
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

Beitrag von Tom »

Code: Alles auswählen

cText := Left(cText,nLesePosition-1)+cNeuerText+Substr(cText,nLesePosition)
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
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

Beitrag von brandelh »

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.

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
:arrow: 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:

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
:arrow: http://www.xbaseforum.de/viewtopic.php?f=16&t=4268

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
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.
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
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

Beitrag von Tom »

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
Benutzeravatar
brandelh
Foren-Moderator
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

Beitrag von brandelh »

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 ...
Gruß
Hubert
Antworten