AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi aus 480 MB txt Datei, bestimmte Zeilen löschen lassen...
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von LuckyStrike4life · begonnen am 5. Feb 2004 · letzter Beitrag vom 5. Feb 2004
Antwort Antwort
Seite 1 von 2  1 2      
LuckyStrike4life

Registriert seit: 22. Jul 2003
Ort: SN
105 Beiträge
 
Delphi 5 Enterprise
 
#1

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

  Alt 5. Feb 2004, 13:52
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?
- ich kann doch wirklich nichts -
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

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

  Alt 5. Feb 2004, 13:54
Ich habe mal so was über zwei Stringlisten gelöst.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
LuckyStrike4life

Registriert seit: 22. Jul 2003
Ort: SN
105 Beiträge
 
Delphi 5 Enterprise
 
#3

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

  Alt 5. Feb 2004, 14:01
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.
- ich kann doch wirklich nichts -
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#4

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

  Alt 5. Feb 2004, 14:02
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 Hier im Forum suchenreguläre Ausdrücke 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.
gruß, choose
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#5

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

  Alt 5. Feb 2004, 14:04
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)...
gruß, choose
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#6

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

  Alt 5. Feb 2004, 14:04
Zitat von LuckyStrike4life:
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?
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#7

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

  Alt 5. Feb 2004, 14:06
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?
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#8

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

  Alt 5. Feb 2004, 14:11
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;
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#9

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

  Alt 5. Feb 2004, 14:12
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).
gruß, choose
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

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

  Alt 5. Feb 2004, 14:14
Autsch. StringReplace dürfte bei so einer Größe tödlich sein, was die Performance angeht.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 13:56 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