Entwickler-Ecke

Dateizugriff - Jede Zeile nach einem bestimmten Zeichen durch suchen


thenewone - Mo 07.03.05 18:05
Titel: Jede Zeile nach einem bestimmten Zeichen durch suchen
Hi @all

Bin hier das 1.Mal, aber ich hoffe ihr könnt mir helfen.
Ich habe in eine ListBox eine Datei geladen, welche ca. 20 Spalten pro Zeile hat.
Ich möchte nun jede Zeile durch gehen, die Werte der 2. und 10. Spalte behalten und
den ganzen anderen "Mist" aus der Datei löschen.

Die Datei soll anschliessend auch gespeichert werden...

Weiss nich so ganz wie ich in Delphi mit Rows und Columns arbeiten kann.Geht das bei einer ListBox überhaupt?

10000000000 Dank im voraus ... :shock:


wdbee - Mo 07.03.05 18:18

Wodurch sind denn in der Datei die Spalten gekennzeichnet? Komma, Semikolon, Tabs oder was?


Tino - Mo 07.03.05 18:20

Hallo und :welcome: hier im Delphi-Forum.de!

Eine Listbox ist etwas schlecht dafür.

Lade die Datei in eine tStringList (mit LoadFromFile) und bearbeitet dann jede Zeile in einer For-Next-Schleife. Anschl. kannst du dann mit SaveToFile die Datei wieder zurück schreiben.

Wie sind denn die Spalten von einander getrennt?

Such am besten mal hier im Forum nach Suche in: Delphi-Forum, Delphi-Library TSTRINGLIST LOADFROMFILE SAVETOFILE.

Gruß
Tino


thenewone - Mo 07.03.05 18:21

Hi,

oh sorry, das wäre evt noch wichtig 8)
Jede Spalte ist getrennt durch ein Semikolon und steht in Hochkommas ...


Tino - Mo 07.03.05 18:30

Hast Du meinen Beitrag gelesen?


thenewone - Mo 07.03.05 18:35

@ Tino

also so in der Art dachte ich mir das ...

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
filename := 'C:\Daten.txt'
StrList.LoadFromFile(filename)

For zaehler := 1 to StrList.count - 1 Do
   Begin
     Try 
       wert := length(StrList[zaehler];
       For zaehler2 := 1 to wert Do
         begin
           zeichen nach Semikolon prüfen;
           wenn ja (2 oder 10) dann Wert behalten sonst löschen
         end;     
     Finally
       StrList.SaveToFile(filename)
     end;
   end;


Moderiert von user profile iconTino: Delphi-Tags hinzugefügt.


wdbee - Mo 07.03.05 18:35


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
procedure LoadFromFile(Filename: string);
var
  StringList: TStringList;
  I, Len: Integer;
  Line, Buffer, Spalte2, Spalte10: string;
begin
  StringList := TStringList.Create;
  try
    StringList.LoadFromFile(Filename);
    for I := 0 to StringList.Count - 1 do
    begin
      Line := StringList[I];
      Len := Pos(';',Line);
      Buffer := Copy(Line,Len+1,9999);   // Rest nach erstem Semikolon

      Len := Pos(';',Buffer);            // Achtung hier den Rest verwenden
      Spalte2 := Copy(Buffer,1,Len-1);   // Inhalt der zweiten Spalte
      Buffer := Copy(Buffer,Len+1,9999); // Rest nach zweitem Semikolon

      Len := Pos(';',Buffer);
      Buffer := Copy(Buffer,Len+1,9999);

//      ...
//      usw.
//      ...

      Len := Pos(';',Buffer);
      Spalte10 := Copy(Buffer,1,Len-1);  // Inhalt der 10. Spalte

      StringList[I] := Spalte2 + ';' + Spalte10;
    end;

  finally
    StringList.SaveToFile('New_' + Filename);
    StringList.Free;
  end;
end;


Tino - Mo 07.03.05 18:43

Um einen String anhand von Trennzeichen zu "zerschneiden" kannst du auch die Funktion Explode [http://www.delphi-forum.de/topic_einen+unterteilten+String+in+ein+Array+schreiben_13017.html].

Gruß
Tino


StefanH - Mo 07.03.05 18:44

ich würd eher mit ExtractStrings arbeiten. also ungefähr so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var sl, sl2: TStringList;
    i: integer;
begin
 sl:= TStringList.Create;
 sl2:= TStringList.Create;
 sl.LoadFromFile('C:\somefoo.txt');
 for i:= 0 to sl.Count-1 do
   begin
      ExtractStrings([';'], [''''], PChar(sl[i]), sl2);
      // nu is sl2[1] deine 2te, sl2[9] deine 10te Spalte - sofern keine Spalte leer ist
   end;


thenewone - Mo 07.03.05 18:59

@StefanH

Hi, vorerst einmal danke, aber hast du das mal getestet?
Ich bekomm einen Fehler 'Inkompatible Typen TStrings und String' :?:


StefanH - Mo 07.03.05 19:06

user profile iconthenewone hat folgendes geschrieben:
@StefanH

Hi, vorerst einmal danke, aber hast du das mal getestet?
Ich bekomm einen Fehler 'Inkompatible Typen TStrings und String' :?:


bei mir gehts? hast du den Code 1:1 übernommen?


thenewone - Mo 07.03.05 19:27

Bis auf das File ja :wink:

Versteh das nicht ...


thenewone - Mo 07.03.05 19:33

@StefanH

ich seh gerade, dass du geschrieben hast, "sofern keine Spalte leer ist..." !!
Das ist natürlich nicht der Fall. Die Spalten können auch Null-Werte habe .



@wdbee
Hab den Code mal probiert. Scheint soweit zu funktionieren, nur 1. stimmt die Positionierung der Spalten nicht so ganz (er schneidet an ner falschen Stelle)
und 2. denk ich dass es doch sicher au etwas einfacher zu proggen geht, als mit
so viel code, oder ?

Trotzdem vielen Dank für den Tip :D


wdbee - Mo 07.03.05 19:41

Bei meiner Delphiversion kommt unter ExtractStrings eine glatte Fehlanzeige.
Aber was stimmt an der Position nicht?


thenewone - Mo 07.03.05 19:47

@wdbee
hab dein Fehler !!

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
for I := 0 to StringList.Count - 1 do  
    begin  
      Line := StringList[I];  
      Len := Pos(';',Line);  
      Buffer := Copy(Line,Len+1,9999); // Rest nach erstem Semikolon  

 
      Len := Pos(';',Buffer);          // Achtung hier den Rest verwenden  
      Spalte2 := Copy(Line,1,Len-1);   // Inhalt der zweiten Spalte  
      Buffer := Copy(Line,Len+1,9999); // Rest nach zweitem Semikolon


Ab Spalte darfst du nicht "LINE" nutzen, sondern musst mit dem alten "BUFFER"
Wert weiter rechnen. Hab ich probiert und es funzt supi :lol:
Nur wie gesagt etwas viel Code

Trotzdem danke ... das hilft mir erst mal weiter. Sind ja nur 800 Zeilen. Das passt schon

Danke nochmal an alle Posts. Ich bin trotzdem weiter dankbar für eine evt. kürzere Variante. Kurz für die Statistik ... ich nutze Delphi 7 Enterprise ...

Moderiert von user profile iconGausi: Delphi-Tags hinzugefügt.


wdbee - Mo 07.03.05 20:02

War auch schon darüber gestolpert. Hab oben das Beispiel korrigiert, falls der nächste das mal braucht.

Aber was meinst du, wie die ExtractStrings-Funktion intern wohl arbeitet? Nur das du da zwei Stringlsiten brauchst und alle Spalten kopiert werden, egal ob alle brauchst oder nur zwei.
Und dann müsstest du noch die Hochkommas manuell entfernen, wenn du sie nicht haben willst, was hier durch -2 und +2 statt -1 und +1 sofort miterledigt wäre. Ach und offensichtlich ist der Code auch leicht zu verstehen, denn du hast den Fehler ja selbst gefunden, was bei dem in Explode sicher etwas länger gedauert hätte.


StefanH - Mo 07.03.05 22:34


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var sl, sl2: TStringList;
    i: integer;
begin
 sl:= TStringList.Create;
 sl2:= TStringList.Create;
 sl.LoadFromFile('C:\somefoo.txt');
 for i:= 0 to sl.Count-1 do
   begin
      ExtractStrings([';'], [], PChar(sl[i]), sl2);
      // nu is sl2[1] deine 2te, sl2[9] deine 10te Spalte - mit Hochkommata
   end;


ich hab meinen Code nochmal geändert... sollte funktionieren, wenn nicht, schau dir mal die Hilfe zu ExtractStrings an bzw die Parameter, vllt hat sihc ja was geändert (was ich eher nicht glaube...)

MfG,