Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi aus 480 MB txt Datei, bestimmte Zeilen löschen lassen... (https://www.delphipraxis.net/15851-aus-480-mb-txt-datei-bestimmte-zeilen-loeschen-lassen.html)

LuckyStrike4life 5. Feb 2004 12:52


aus 480 MB txt Datei, bestimmte Zeilen löschen lassen...
 
Morgen,
mal was ganz anderes.
Eine txt die 480 MB klein ist, enthält tausende Datensätze. Es handelt sich um GPS Daten, in der Form von X, Y und Z.

Mal ein kleiner Auszug:
Delphi-Quellcode:
         .00          .00      -300.00   0
  6000193.27   4526048.99        53.87  51
  6000193.75   4526047.31        53.87  51
  6000194.24   4526045.63        53.76  69
  6000194.72   4526043.96        53.82  60
  6000195.20   4526042.30        53.92  43
  6000195.69   4526040.61        53.84  39
  6000196.17   4526038.93        53.79  39
  6000196.66   4526037.26        53.79  43
  6000197.14   4526035.58        53.78  47
  6000197.63   4526033.90        53.81  39
         .00          .00      -300.00   0
         .00          .00      -300.00   0
         .00          .00      -300.00   0
Wenn jetzt an der 31sten Stelle bis zur 35sten "-300" steht, dann muss die Reie gelöscht werden.

Meine Überlegungen sehen so aus:
Delphi-Quellcode:
var tin, tout:Textfile;
    lese:String;
begin
  AssignFile(tin, 'c:\kai.txt');    // Name der Datei ist kai, lasse sie damit Laden
  AssignFile(tout, 'c:\kaineu.txt'); // gebe hier Name und Pfad an, wo das Resultat dann hin soll
  Reset(tin);
  Rewrite(tout);
  while not Eof(tin) do
  begin
     ReadLn(tin, lese);
[...] // ab hier fehlts mir
  end;
  CloseFile(tout);
  CloseFile(tin);
end;
Also doch sehr schlecht...
Wie kann man das Problem lösen?

Luckie 5. Feb 2004 12:54

Re: aus 480 MB txt Datei, bestimmte Zeilen löschen lassen...
 
Ich habe mal so was über zwei Stringlisten gelöst.

LuckyStrike4life 5. Feb 2004 13:01

Re: aus 480 MB txt Datei, bestimmte Zeilen löschen lassen...
 
Zitat:

Zitat von Luckie
Ich habe mal so was über zwei Stringlisten gelöst.

aha, werd doch mal genauer... ich spiel schon mit dem Gedanken die txt in eine Datenbank umzuwandeln mit 3 Spalten... . Aber die Idee ist blöd.

choose 5. Feb 2004 13:02

Re: aus 480 MB txt Datei, bestimmte Zeilen löschen lassen...
 
Hallo LuckyStrike4life,

generell sollte der fehlende Abschnitt in etwa so lauten:
Delphi-Quellcode:
while not Eof(tin) do
begin
  ReadLn(tin, lese);
  if DoesStringMatchCriteria(lese) then
    WriteLn(tout);
end;
Die Frage lautet also, wie ermittelst Du, ob der String das von Dir geforderte Kriterium (DoesStringMatchCriteria) erfüllt. Generell verwende ich bei der Verarbeitung von Strings gerne [dp]reguläre Ausdrücke[/dp] in diesem Fall ist das Problem aber nicht zu letzt von der Ausführungszeit bestimmt und die Daten auch recht einfach beschaffen.
Ich empfehle Dir deshalb den Einsatz von Copy (Teilbereich extrahieren), Trim (Leerzeichen des ermittelten Teilbereichs entferen) und StrToIntDef bzw Val (Rest: Zahl als String in Zahl umwandeln) um die Daten zu verarbeiten. Ein letztlicher Vergleich gegen -300 bildet dann den Rückgabewert von DoesStringMatchCriteria.

choose 5. Feb 2004 13:04

Re: aus 480 MB txt Datei, bestimmte Zeilen löschen lassen...
 
Hallo Luckie,

den Einsatz von Stringlisten halte ich bei der Art deren Implementierung (sofern Du TStringList meinst) bei der Dateigröße von knapp 0,5GB für gewagt (schließlich würde die Datei zunächst vollständig in den RAM geladen werden)...

Die Muhkuh 5. Feb 2004 13:04

Re: aus 480 MB txt Datei, bestimmte Zeilen löschen lassen...
 
Zitat:

Zitat von LuckyStrike4life
Zitat:

Zitat von Luckie
Ich habe mal so was über zwei Stringlisten gelöst.

aha, werd doch mal genauer... ich spiel schon mit dem Gedanken die txt in eine Datenbank umzuwandeln mit 3 Spalten... . Aber die Idee ist blöd.

Die Aussage von Luckie dürfte eigentlich langen damit du drauf kommst.

Wo liegt denn das Problem?
Stringliste erstellen?

Die Muhkuh 5. Feb 2004 13:06

Re: aus 480 MB txt Datei, bestimmte Zeilen löschen lassen...
 
Zitat:

Zitat von choose
Hallo Luckie,

den Einsatz von Stringlisten halte ich bei der Art deren Implementierung (sofern Du TStringList meinst) bei der Dateigröße von knapp 0,5GB für gewagt (schließlich würde die Datei zunächst vollständig in den RAM geladen werden)...

Kennst du noch eine andere Stringlist? :roll:

stoxx 5. Feb 2004 13:11

Re: aus 480 MB txt Datei, bestimmte Zeilen löschen lassen...
 
Zitat:

Zitat von LuckyStrike4life

Meine Überlegungen sehen so aus:
Delphi-Quellcode:
var tin, tout:Textfile;
    lese:String;
begin
  AssignFile(tin, 'c:\kai.txt');    // Name der Datei ist kai, lasse sie damit Laden
  AssignFile(tout, 'c:\kaineu.txt'); // gebe hier Name und Pfad an, wo das Resultat dann hin soll
  Reset(tin);
  Rewrite(tout);
  while not Eof(tin) do
  begin
     ReadLn(tin, lese);
[...] // ab hier fehlts mir
  end;
  CloseFile(tout);
  CloseFile(tin);
end;
Also doch sehr schlecht...
Wie kann man das Problem lösen?


Hallo LuckyStrike4life,

die Idee ist schon richtig, in den Speicher sollte man so eine Datei wirklich nicht laden.
das Spaltentrennzeichen ist sicherlich Tab. Guck Dir mal Stringreplace an.
von jeder Spalte die einzelne Zelle überprüfen, ob negativ, dann löschen. bzw nicht neu schreiben.

vielleicht hilft Dir diese kleine Funktion weiter ?

Code:
function GetStrNr(const aStr, delim: string; nr: integer): string;
begin
  with TStringList.Create do begin
    Text := StringReplace(aStr, delim, #13#10, [rfReplaceAll]);
    result := strings[nr - 1];
    free;
  end;
end;

choose 5. Feb 2004 13:12

Re: aus 480 MB txt Datei, bestimmte Zeilen löschen lassen...
 
Zitat:

Zitat von Spider
Kennst du noch eine andere Stringlist?

Ja. Wenn Du mal in der OH unter Stringlisten nachschlägst, wirst Du feststellen, dass das Delphi-Konzept hier mit einer abstrakten Oberklasse TStrings arbeitet. Alle konkreten Erben dieser Klasse fallen somit in diese Kategorie und ermöglichen den transparenten (ohne, dass der "unwissende" Delphi-Enwickler etwas davon ahnt) Einsatz von TStrings innerhalb von Comboboxen, Memos, etc. obgleich hier zB die konkreten Klassen TCustomComboBoxStrings, TMemoStrings, etc. verwendet werden. Die Kompatibilität zu der häufig verwendeten TStringList wird dabei nur dank der Polymorphie erreicht, weil alle Klasse von TStrings erben...

Ich selbst kenne und verwende diverse andere Implementierungen (zB aus Performancegründen oder auch, um transparent mit String-Ressourcen umzugehen).

Luckie 5. Feb 2004 13:14

Re: aus 480 MB txt Datei, bestimmte Zeilen löschen lassen...
 
Autsch. StringReplace dürfte bei so einer Größe tödlich sein, was die Performance angeht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:18 Uhr.
Seite 1 von 2  1 2      

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