![]() |
Re: Spaltenweise auf TStringList zugreifen
Klar in der 2. Stringliste befindet sich immer nur eine Zeile.
|
Re: Spaltenweise auf TStringList zugreifen
Ich denke du willst da nur etwas berechnen. Was hat denn jetzt plötzlich die Speicherung in einer Datei für einen Sinn? :gruebel:
Ich sehe bei den Variablennamen gerade nicht mehr durch. Was du machen musst ist in StringList A die Datei zu laden. Dann gehst du deren Zeilen durch. Für jede Zeile legst deren Inhalt in DelimitedText von StringList B, dann hast du die Spalten der Zeile in den Strings von StringList B. Du kannst also jetzt dort die Spalten durchgehen. Danach gehst du zur nächsten Zeile. Was du da jetzt mir ZwischenSpeicher, ZwSpeicher und Sek machst, da sehe ich nicht durch. Du lädst in ZwischenSpeicher und liest dann in der Schleife aus Sek in ZwSpeicher? :gruebel: |
Re: Spaltenweise auf TStringList zugreifen
Zitat:
Mein Fehler sorry:
Delphi-Quellcode:
ZwSpeicher.Delimiter := #9;
for i := 1 to VorhandeneDatei.Count-1 do ZwSpeicher.DelimitedText := VorhandeneDatei.Strings[i]; |
Re: Spaltenweise auf TStringList zugreifen
Zitat:
Naja, da du ja anscheinend keinen kompletten Code posten willst, kann ich da auch nicht viel zu sagen außer dass du anscheinend nix mit den Spalten machst... Hier mal nen kleines Beispiel (ungetestet):
Delphi-Quellcode:
var
FileContents, LineCols: TStringList; i, j: Integer; begin FileContents := TStringList.Create; try FileContents.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'TestFile.txt'); LineCols := TStringList.Create; try LineCols.Delimiter := #9; LineCols.StrictDelimiter := True; for i := 0 to Pred(FileContents.Count) do begin LineCols.DelimitedText := FileContents[i]; for j := 0 to Pred(LineCols.Count) do ShowMessage('Zeile ' + IntToStr(i) + ', Spalte ' + IntToStr(j) + ': ' + LineCols[j]); end; finally LineCols.Free; end; finally FileContents.Free; end; |
Re: Spaltenweise auf TStringList zugreifen
Genauso habe ich es gemacht. und nun habe ich aus der zeile:
27.07.2009 09:32:55 0,0 800,0 0,0 -30,0 die spalte : 27.07.2009 09:32:55 0,0 800,0 0,0 -30,0 gewonnnen. Nochmal zu meinem Problem : Meine Ursprungsdatei ist wie folgt aufgebaut : Datum Uhrzeit MW1 MW2 MW3 MW4 27.07.2009 09:32:55 0,0 800,0 0,3 -31,0 27.07.2009 09:32:58 0,1 820,0 0,3 -32,0 27.07.2009 09:33:01 0,3 805,0 0,2 -31,0 27.07.2009 09:33:04 0,7 821,0 0,7 -33,0 Nun möchte ich u.a. den Mittelwert aus der Spalte MW2 berechnen. Mit StringList kann ich aber nur Zeilenweise arbeiten und mit euren obigen Voschlägen habe ich ja auch nichts gewonnen, da ich immer nur eine Spalte zu Verfügung habe. Oder habe ich hier gerade etwas wichtiges übersehen? |
Re: Spaltenweise auf TStringList zugreifen
Wie ich schon sagte: Leg die Werte in ein zweidimensionales Array. Dort kannst du dann ja problemlos auf die Spalten zugreifen.
|
Re: Spaltenweise auf TStringList zugreifen
Also ich versuche es jetzt mit nem Array
Delphi-Quellcode:
und dem Code :
var StringArray: array of array of string;
Zeilenanzahl, Spaltenanzahl : integer
Delphi-Quellcode:
Allerdings möchte ich den Header aus der Sek StringList gar nicht erst als DelimitedText im ZwSpeicher haben. Wie umgehe ich das?ZwSpeicher := TStringList.Create; Sek := TStringList.Create; begin ZwSpeicher.Delimiter := #9; ZwSpeicher.DelimitedText := Sek.Strings[Sek.Count-1]; //um die Spaltenanzahl zu bestimmen Spaltenanzahl := ZwSpeicher.Count; Zeilenanzahl := Sek.Count; //für die Zeilenanzahl Setlength(StringArray,Spaltenanzahl,Zeilenanzahl); for s := 0 to Spaltenanzahl-1 do // jetzt möchte ich die Werte der Zeilen ins Array schreiben begin StringArray[s,0] := ZwSpeicher.Strings[s]; end; end; |
Re: Spaltenweise auf TStringList zugreifen
Ich finde es wäre viel einfacher von der Handhabung deine Daten pro Zeile in Objekte zu schreiben und diese Objekte in einer TObjectList zu verwalten. Dieses auf Teufel komm raus mit Strings rumhantieren ist echt sehr suboptimal.
Delphi-Quellcode:
Dann kannst du auch simpel Mittelwertberechnungen durchführen.type TMyDataObject = class public Datum: TDateTime; Wert1: float; Wert2: int; usw. end;
Delphi-Quellcode:
Auch jede andere Funktionalität lässt sich ab diesem Zeitpunkt modular einbauen.function BerechneMittelwertVonWert1(): float; var i, anzahlElemente: integer; gesamt: float; begin gesamt = 0; anzahlElemente := myObjectList.Count; for i = 0 to anzahlElemente-1 do begin gesamt := gesamt + TMyDataObject(myObjectList).Wert1; end result := gesamt/anzahlElemente; end; |
Re: Spaltenweise auf TStringList zugreifen
Zitat:
Zweitens: Du erzeugst Sek neu. Meinst du, dass Sek.Count etwas anderes als 0 sein kann direkt danach? Was wird also Sek.Strings[Sek.Count-1] sein... (usw.) |
Re: Spaltenweise auf TStringList zugreifen
Habe es jetzt ersteinmal folgendermaßen zu lösen versucht (ohne Berechnung):
Delphi-Quellcode:
Funktioniert an sich ganz gut, aber irgendetwas läuft da noch schief. Kommt eine neue Zeile in der 3SekDatei hinzu wird die im ZwSpeicher zu einer Spalte und sollte von dort ins Array und somit in die Test.txt geschrieben werden...In die Test.txt wird aber immer nur die neue Zeile geschrieben und zwar so oft, wie Zeilen in der 3SekDatei vorhanden sind.Die vorherigen verschwinden. Was mache ich falsch?
procedure ZehnMinTimerEvent(Sender: TObject);
var Sek, Min, ZwSpeicher : TStringList; DreiSek, ZehnMin, temp1, temp2 : string; Spaltenanzahl, Zeilenanzahl,z,s : integer; StringArray: array of array of string; TestDatei : TFileStream; begin DreiSek := extractfilepath(application.exename)+'3sek_'+Kennung+'.txt'; ZehnMin := extractfilepath(application.exename)+'10min_'+Kennung+'.txt'; TestDatei := TFileStream.Create(ExtractFilePath(application.exename)+'test.txt', fmCreate); Sek := TStringList.Create; Min := TStringList.Create; ZwSpeicher := TStringList.Create; try Sek.LoadFromFile(DreiSek); Min.LoadFromFile(ZehnMin); temp1 := Sek.Strings[Sek.Count-1]; temp2 := Min.Strings[Min.Count-1]; while Min.Count >= 2 do //maximal 1 Zeile + Header Min.Delete(1); if temp1 <> temp2 then ZwSpeicher.Delimiter := #9; if Sek.Count >= 2 then begin ZwSpeicher.DelimitedText := Sek.Strings[Sek.Count-1]; Spaltenanzahl := ZwSpeicher.Count-2; //ohne Datum und Uhrzeit Zeilenanzahl := Sek.Count-1; //ohne Header Setlength(StringArray,Spaltenanzahl,Zeilenanzahl); for z := 0 to Zeilenanzahl-1 do begin; for s := 0 to Spaltenanzahl-2 do begin StringArray[s,z] := ZwSpeicher.Strings[s+2]; Temp := (StringArray[s,z]) + ';'; TestDatei.Write(PChar(Temp)^,Length(Temp)); end; Temp := (StringArray[s,z]) + #13#10; TestDatei.Write(PChar(Temp)^,Length(Temp)); end; end; end; finally TestDatei.Free; ZwSpeicher.Free; Min.Free; Sek.Free; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:39 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz