Autor |
Beitrag |
thenewone
Hält's aus hier
Beiträge: 10
|
Verfasst: 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 ... 
|
|
wdbee
      
Beiträge: 628
Erhaltene Danke: 1
|
Verfasst: Mo 07.03.05 18:18
Wodurch sind denn in der Datei die Spalten gekennzeichnet? Komma, Semikolon, Tabs oder was?
|
|
Tino
      

Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: Mo 07.03.05 18:20
Hallo und  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 TSTRINGLIST LOADFROMFILE SAVETOFILE.
Gruß
Tino
Zuletzt bearbeitet von Tino am Mo 07.03.05 18:22, insgesamt 1-mal bearbeitet
|
|
thenewone 
Hält's aus hier
Beiträge: 10
|
Verfasst: Mo 07.03.05 18:21
Hi,
oh sorry, das wäre evt noch wichtig
Jede Spalte ist getrennt durch ein Semikolon und steht in Hochkommas ...
|
|
Tino
      

Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: Mo 07.03.05 18:30
Hast Du meinen Beitrag gelesen?
|
|
thenewone 
Hält's aus hier
Beiträge: 10
|
Verfasst: 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 Tino: Delphi-Tags hinzugefügt.
|
|
wdbee
      
Beiträge: 628
Erhaltene Danke: 1
|
Verfasst: Mo 07.03.05 18:35
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); Len := Pos(';',Buffer); Spalte2 := Copy(Buffer,1,Len-1); Buffer := Copy(Buffer,Len+1,9999); Len := Pos(';',Buffer); Buffer := Copy(Buffer,Len+1,9999);
Len := Pos(';',Buffer); Spalte10 := Copy(Buffer,1,Len-1); 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
      

Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: Mo 07.03.05 18:43
Um einen String anhand von Trennzeichen zu "zerschneiden" kannst du auch die Funktion Explode.
Gruß
Tino
|
|
StefanH
      
Beiträge: 1144
Win XP
D5 Standard, D7 Pers, D2005 Pers
|
Verfasst: 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); 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 
Hält's aus hier
Beiträge: 10
|
Verfasst: 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
      
Beiträge: 1144
Win XP
D5 Standard, D7 Pers, D2005 Pers
|
Verfasst: Mo 07.03.05 19:06
thenewone 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 
Hält's aus hier
Beiträge: 10
|
Verfasst: Mo 07.03.05 19:27
Bis auf das File ja
Versteh das nicht ...
|
|
thenewone 
Hält's aus hier
Beiträge: 10
|
Verfasst: 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 
|
|
wdbee
      
Beiträge: 628
Erhaltene Danke: 1
|
Verfasst: Mo 07.03.05 19:41
Bei meiner Delphiversion kommt unter ExtractStrings eine glatte Fehlanzeige.
Aber was stimmt an der Position nicht?
|
|
thenewone 
Hält's aus hier
Beiträge: 10
|
Verfasst: 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); Len := Pos(';',Buffer); Spalte2 := Copy(Line,1,Len-1); Buffer := Copy(Line,Len+1,9999); |
Ab Spalte darfst du nicht "LINE" nutzen, sondern musst mit dem alten "BUFFER"
Wert weiter rechnen. Hab ich probiert und es funzt supi
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 Gausi: Delphi-Tags hinzugefügt.
|
|
wdbee
      
Beiträge: 628
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 1144
Win XP
D5 Standard, D7 Pers, D2005 Pers
|
Verfasst: 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); 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)
|
|