AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Lesen, Schreiben und mehr in Textdateien - TFileStream, ...?
Thema durchsuchen
Ansicht
Themen-Optionen

Lesen, Schreiben und mehr in Textdateien - TFileStream, ...?

Ein Thema von Totti · begonnen am 12. Nov 2005 · letzter Beitrag vom 4. Dez 2005
Antwort Antwort
Seite 2 von 4     12 34      
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#11

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,

  Alt 26. Nov 2005, 10:27
Du könntest natürlich auch erstmal alles in ein dynamisches Array einlesen (pro Zeile ein Array-Feld), die nötigen/gewünschten Änderungen vornehmen und dann dieses wieder in die Datei zurückschreiben. (das Einlesen wird aber etwas, bis sehr viel langsamer werden, als mit 'nem einzelnem String ... je nachdem wie du dieses optimierst)


Zitat von Totti:
ne, seek läuft net bei textfile
Nicht ganz die Warheit mein Seek64 funktioniert inoffiziell damit. > 64-Bit für TextFile / File of xxx
Allerdings muß man dort wissen, was man macht, da ja der nachfolgende Text nicht verschoben wird, wenn die neue Zeile (welche man reinschreiben möchte) länger/kürzer ist, als die Aktuelle (welche im Moment in der Datei drinsteht), weßhalb ich dieses Feature nicht offiziell erwähnt hab.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Totti
Totti

Registriert seit: 1. Dez 2004
Ort: Harrislee
59 Beiträge
 
Delphi 2005 Personal
 
#12

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,

  Alt 27. Nov 2005, 12:32
ja, das mitm array wäre ne gute Idee ... wenn es denn schneller als ne TStringList ist, wie ich hoffe. DAs gute wäre eben, dass man Zeilen direkt anspringen kann, im gegensatz zu dem einzelnen string ... wäre halt alles ein wenig übersichtlicher von der handhabung her. Ich versuchs mal damit, danke für den Tip.


Den anderen kann ich leider weniger gebrauchen, da es wohl häufiger vorkommen wird, dass ich was längeres/kürzeres eintragen muss.
Malte
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#13

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,

  Alt 27. Nov 2005, 13:44
ich verstehe dein problem denn genau das gleiche habe ich auch mit playlisten.

Ich möchte nämnlich eine große datei von über 10.000 zeilen berabeiten und habe dort nur paar möglichkeiten.

1. Ich lese mit TFileStream(ist die beste wahl glaube ich auch wenn es mit dem debugger schwirik wird)
den block ein denn ich möchte z.b.
die ersten zwei zeilen vor jeder zeile steht die länge und die addierst du einfach zusammen und fertig.

anschließend schreisbt du jede zeile in ein array und bearbeites diesen in einem memo problem dabei ist wenn sich die zeilen anzahl verwändert dann muss du ein neuen array erstellen und denn in die datei zurück schreiben wobei genau hier kommt ein problem auf:
verschieeb ich alle zeieln nach hinten ?
oder erstelle ich eine neue datei z.b. so:
ich weiß das ich die ersten zwei zeilen geändert habe also kopiere ich zuerst die neuen datein in die datei rein und dann kopier ist aber der 21 zeile alles bild in die neue datei rein.
(das währe das einfachste glaube ich, oder ?

2. du machst es mit "File of Text" wobei hier kannst du den zeilen inder nicht einfach mit seek ändern

3. du machst das so wie bei 1. nur du speicherst die blöcke nicht in die große datei sondern legst mehre kleine ein, und wenn du fertig bist kopiert du alles zusaemmn.

warscheinlich ist es am besten ein misch aus 1 und 3 zu machen.
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
Benutzerbild von Totti
Totti

Registriert seit: 1. Dez 2004
Ort: Harrislee
59 Beiträge
 
Delphi 2005 Personal
 
#14

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,

  Alt 27. Nov 2005, 14:56
Ich darf zum Glück garnicht die zeilenanzahl verändern, weil ich dann die Sytax durcheinander bringe ... nur die Zeilenlängen

Aber was meintest du mit "id eLänge steht vor jeder Zeile"?
ich meine mich zu erinnern, dass ich mir mal den Stream angeschaut hab und die Zeilen lediglich durchein #13#10 getrennt waren und net noch mit ner Zusätzlichen Längenangabe.

Ode rist da sjetzt dein spezifisches Playlistformat?
Malte
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#15

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,

  Alt 27. Nov 2005, 15:33
Zitat von himitsu:
...
Zitat von Totti:
ne, seek läuft net bei textfile
Nicht ganz die Warheit mein Seek64 funktioniert inoffiziell damit.
Äh, dem TFilestream.seek ist es doch völlig egal, wohin es den FilePointer per 'Seek' hinschiebt. Ergo geht TFileStream.Seek mit allen Dateien. Ausnahmslos.
Was Du benötigst, ist ein Random File Access auf eine Textdatei. Das ist immer mit einem zusätzlichen Aufwand verbunden. Eine TStringlist ist ordendlich flott und sooo einfach. Teste das erstmal, bevor Du bezweifelst, ob Dir das reicht.

Wenn Du dann doch noch schnellere Tools brauchst, dann verwende ein TFileStream, lies die Datei in einen internen Buffer und schreibe Dir eigene Routinen, um diesen Buffer zeilenweise zu manipulieren. In Zeiten, wo der CPU in GHZ gemessen wird, sollten die Prozeduren unterhalb der Messgenauigkeit liegen. Wie lange dauert es denn, 4MB Textdaten im Speicher zu verschieben, um eine neue Zeile an erster Stelle einzufügen?

Imho gibt es keine Möglichkeit, "mal eben" (also sehr schnell) die 1517.te Zeile einer 122.959.454 Zeilen umfassenden Textdatei zu löschen.
Dazu sind eben Dateien mit fester Recordgröße ("File Of TRecord") da. Oder Datenbanken.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Totti
Totti

Registriert seit: 1. Dez 2004
Ort: Harrislee
59 Beiträge
 
Delphi 2005 Personal
 
#16

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,

  Alt 27. Nov 2005, 15:58
Dass das seek net geht war auf file of text bezogen und net auf das Öffnen einer txt-datei mittels tfilestream.

Des Weiteren macht es erhebliche Unterschiede, ob du ne TStringlist zum einlesen und durchforsten (ohne Schreibvorgang) nutzt oder file of text mit anschließendem readln, wenn du 200 Dateien mit ner gesamtgröße von 40MB hast ... glaubs mir, das macht gut und gerne mal 30 Sekunden unterschied.
Malte
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#17

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,

  Alt 27. Nov 2005, 16:05
Nee, is klar. Ich wusste nicht (zu faul, den Thread zu lesen?) das Du massenhaft Dateien verarbeiten musst. Ich mach mir normalerweise die Mühe nicht und verwende TStringList weil das nur 5 Zeilen sind (Create,Load,Modify,Write,Free). Ein wenig kann man noch rausholen, indem man die TStringList.Capacity am Anfang hochsetzt.

[edit] Das mit den 30 Sekunden kann bei 40MB ich nicht nachvollziehen. TStringList.LoadFromFile dauert bei einer 50MB Textdatei 800ms [/edit]
Ich habe mal mit TFileStream auf Textdateien gearbeitet. Schneller hab ich es nicht hinbekommen. Es geht aber schneller, und zwar mit Scatter/Gather I/O. Tut aber weh.

Wenn es flott gehen soll, würde ich mit TFileStream arbeiten. Musst Du nur jeweils eine Zeile verändern?
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Totti
Totti

Registriert seit: 1. Dez 2004
Ort: Harrislee
59 Beiträge
 
Delphi 2005 Personal
 
#18

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,

  Alt 27. Nov 2005, 19:14
Nein ... in einigen Dateien garkeine, in eingen mehere Hundert Zeilen ... ich muss aber in jedem Fall alle Zeilen durchgehen ...
und die, die geändert werden, die haben dann meist net dieselbe Länge wie vorher, sondern gerne mal das 9-fache (von 1 zeichen auf 9 ^^).

Und wieso das mit der TStringlist solang dauert ... naja ... in den Prozeduren waren auch vergleiche und vermischen und sortieren ud wieder abgleichen zusätzlich zu indexof (habe keine sortierten listen) aktionen ...

Der Code war bestimmt auchnet der beste
Malte
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#19

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,

  Alt 27. Nov 2005, 19:29
Was Du machen könntest, ist Folgendes:
Delphi-Quellcode:
Procedure ProcessFile (aFile : String);
Var
  fIn, fOut : TFileStream;

Begin
  fIn := TFileStream.Create (aFile, fmOpenRead);
  Try
    fOut := TFileStream.Create (ExtraceFilePath (aFile)+'Temp.$$$', fmCreate);
    Try
      While ReadString (fIn, aString) Do
        WriteString (fOut, TranslateLine (aString));
    Finally
      fOut.Free;
    End;
  Finally
    fIn.Free;
  End;
  DeleteFile (aFile);
  RenameFile (ExtraceFilePath (aFile)+'Temp.$$$', aFile);
End;
Die Funktion 'TranslateLine' soll dann die Zeile übersetzen... Was ich hier veranschaulichen wollte, ist das rüberschaufeln und gleichzeitige Übersetzen. Wenn Du das hinbekommst, sollte es eigentlich recht flott gehen... Die ReadString und WriteString Routinen musst Du dir noch zurechtbasteln.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Totti
Totti

Registriert seit: 1. Dez 2004
Ort: Harrislee
59 Beiträge
 
Delphi 2005 Personal
 
#20

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,

  Alt 27. Nov 2005, 19:33
Ähm, vielen Dank, für die Mühe, die du dir machst. Wenn ich aber in Zeile 9923 auf einen bestimmten Ausdruck stoße, wäre es im Idealfall gut, in Zeile 9845 daraufhin etwas ändern zu können.


Ich check einfach mal aus, wie schnell sich die TSTringListen machen, wenn man den Quelltext net so hinmüllt wie ich vor 1,5 Jahren als blutiger Anfänger - wenn ich dann zeit und Lust habe, schreib ich die Passagen, die nur ein Editieren der aktuellen oder maximal eine drüberliegende Zeile brauchen, mal um, um den Zeitunterschied feststellen zu können. Wenn das nächstes Jahr Weihnachten dann soweit ist, geb ichs hiermal kurz durch ^^
Malte
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:12 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz