Autor Beitrag
thenewone
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mo 07.03.05 18:05 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: Mo 07.03.05 18:18 
Wodurch sind denn in der Datei die Spalten gekennzeichnet? Komma, Semikolon, Tabs oder was?
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: 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


Zuletzt bearbeitet von Tino am Mo 07.03.05 18:22, insgesamt 1-mal bearbeitet
thenewone Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Mo 07.03.05 18:30 
Hast Du meinen Beitrag gelesen?
thenewone Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mo 07.03.05 18:35 
@ Tino

also so in der Art dachte ich mir das ...
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: Mo 07.03.05 18:35 
ausblenden volle Höhe 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;


Zuletzt bearbeitet von wdbee am Mo 07.03.05 19:49, insgesamt 1-mal bearbeitet
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Mo 07.03.05 18:43 
Um einen String anhand von Trennzeichen zu "zerschneiden" kannst du auch die Funktion Explode.

Gruß
Tino
StefanH
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1144

Win XP
D5 Standard, D7 Pers, D2005 Pers
BeitragVerfasst: Mo 07.03.05 18:44 
ich würd eher mit ExtractStrings arbeiten. also ungefähr so:

ausblenden 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;

_________________
"Als es noch keine Computer gab, war das Programmieren noch relativ einfach."(Edsger W. Dijkstra)
"Ich bin nicht von Sinnen, sondern ich rede wahre und vernünftige Worte." (Paulus)
thenewone Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1144

Win XP
D5 Standard, D7 Pers, D2005 Pers
BeitragVerfasst: 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?

_________________
"Als es noch keine Computer gab, war das Programmieren noch relativ einfach."(Edsger W. Dijkstra)
"Ich bin nicht von Sinnen, sondern ich rede wahre und vernünftige Worte." (Paulus)
thenewone Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mo 07.03.05 19:27 
Bis auf das File ja :wink:

Versteh das nicht ...
thenewone Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: Mo 07.03.05 19:41 
Bei meiner Delphiversion kommt unter ExtractStrings eine glatte Fehlanzeige.
Aber was stimmt an der Position nicht?
thenewone Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mo 07.03.05 19:47 
@wdbee
hab dein Fehler !!
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: 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.


Zuletzt bearbeitet von wdbee am Di 08.03.05 07:46, insgesamt 1-mal bearbeitet
StefanH
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1144

Win XP
D5 Standard, D7 Pers, D2005 Pers
BeitragVerfasst: Mo 07.03.05 22:34 
ausblenden 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,

_________________
"Als es noch keine Computer gab, war das Programmieren noch relativ einfach."(Edsger W. Dijkstra)
"Ich bin nicht von Sinnen, sondern ich rede wahre und vernünftige Worte." (Paulus)