AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Spaltenweise auf TStringList zugreifen

Ein Thema von aaaaaaaaaa_10 · begonnen am 27. Jul 2009 · letzter Beitrag vom 30. Jul 2009
Antwort Antwort
Seite 2 von 8     12 34     Letzte »    
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#11

Re: Spaltenweise auf TStringList zugreifen

  Alt 27. Jul 2009, 08:47
Klar in der 2. Stringliste befindet sich immer nur eine Zeile.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#12

Re: Spaltenweise auf TStringList zugreifen

  Alt 27. Jul 2009, 08:50
Ich denke du willst da nur etwas berechnen. Was hat denn jetzt plötzlich die Speicherung in einer Datei für einen Sinn?

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?
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
aaaaaaaaaa_10
(Gast)

n/a Beiträge
 
#13

Re: Spaltenweise auf TStringList zugreifen

  Alt 27. Jul 2009, 08:54
Zitat:
Ich denke du willst da nur etwas berechnen. Was hat denn jetzt plötzlich die Speicherung in einer Datei für einen Sinn?
Wollte nur schauen, was drin steht .

Mein Fehler sorry:

Delphi-Quellcode:
ZwSpeicher.Delimiter := #9;
         for i := 1 to VorhandeneDatei.Count-1 do
          ZwSpeicher.DelimitedText := VorhandeneDatei.Strings[i];
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#14

Re: Spaltenweise auf TStringList zugreifen

  Alt 27. Jul 2009, 09:08
Zitat von aaaaaaaaaa_10:
Wollte nur schauen, was drin steht .
Wofür gibts den Debugger?

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;
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
aaaaaaaaaa_10
(Gast)

n/a Beiträge
 
#15

Re: Spaltenweise auf TStringList zugreifen

  Alt 27. Jul 2009, 09:40
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?
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#16

Re: Spaltenweise auf TStringList zugreifen

  Alt 27. Jul 2009, 09:42
Wie ich schon sagte: Leg die Werte in ein zweidimensionales Array. Dort kannst du dann ja problemlos auf die Spalten zugreifen.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
aaaaaaaaaa_10
(Gast)

n/a Beiträge
 
#17

Re: Spaltenweise auf TStringList zugreifen

  Alt 27. Jul 2009, 10:48
Also ich versuche es jetzt mit nem Array
Delphi-Quellcode:
var StringArray: array of array of string;
Zeilenanzahl, Spaltenanzahl : integer
und dem Code :
Delphi-Quellcode:

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;
Allerdings möchte ich den Header aus der Sek StringList gar nicht erst als DelimitedText im ZwSpeicher haben. Wie umgehe ich das?
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#18

Re: Spaltenweise auf TStringList zugreifen

  Alt 27. Jul 2009, 10:52
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:

type
  TMyDataObject = class
    public
      Datum: TDateTime;
      Wert1: float;
      Wert2: int;
      usw.
   end;
Dann kannst du auch simpel Mittelwertberechnungen durchführen.

Delphi-Quellcode:

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;
Auch jede andere Funktionalität lässt sich ab diesem Zeitpunkt modular einbauen.
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#19

Re: Spaltenweise auf TStringList zugreifen

  Alt 27. Jul 2009, 10:54
Zitat von aaaaaaaaaa_10:
Delphi-Quellcode:
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
Erstens fehlt da ein Ressourcenschutzblock (try..finally), was machst du bei einer Exception in dem Bereich?
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.)
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
aaaaaaaaaa_10
(Gast)

n/a Beiträge
 
#20

Re: Spaltenweise auf TStringList zugreifen

  Alt 28. Jul 2009, 09:07
Habe es jetzt ersteinmal folgendermaßen zu lösen versucht (ohne Berechnung):

Delphi-Quellcode:
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;
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?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 8     12 34     Letzte »    


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 16:32 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