Autor Beitrag
molnarflo
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 21.05.04 11:08 
Hallo Leute!

Stehe vor einem - meiner Meinung nach - sehr kniffligem Problem: Ich habe eine Textdatei mit verschiedenen Messergebnissen und möchte diese Auswerten. Die Sortierung soll so erfolgen, dass für jedes Datum und Zeit die dazugehörigen Messdaten in einem Datensatz stehen.

Die Textdatei sieht folgendermaßen aus:

ausblenden volle Höhe 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:
Measure:    1  Time: Mar 23 11:24:18 2004 
Analog Inputs: 
C-01:   0.0 ˙˙ AC-02:   4.8 ˙˙ AC-03:   6.3 ˙˙ AC-04:   6.2 ˙˙ AC-05:   5.4 ˙˙ AC-06:   6.4 ˙˙ A 
C-07:  14.2 ˙˙ AC-08: 180.0 ˙˙ AC-09: 180.0 ˙˙ AC-10:  15.3 ˙˙ AC-11: 180.0 ˙˙ AC-12:  15.5 ˙˙ A 
C-13: 180.0 ˙˙ AC-14:  13.1 ˙˙ AC-15:  65.2 ˙˙ AC-16:  65.4 ˙˙ AC-17:  59.8 ˙˙ AC-18:   0.1 ˙˙ A 
C-19:   0.0 ˙˙ AC-20: 180.0 ˙˙ AC-21:  59.3 ˙˙ AC-22: 180.0 ˙˙ AC-23:  41.8 ˙˙ AC-24:  15.2 ˙˙ A 
C-25:  16.5 ˙˙ AC-26:   9.8 ˙˙ A 
Analog Outputs: 
C-01:   0.0 ˙˙ AC-02:   0.0 ˙˙ AC-03:   0.0 ˙˙ A 
Relais: 1: 0, 2: 0, 3: 0, 4: 0 
Data-Next: <far>0027:0070H 

Measure:    2  Time: Mar 23 11:50:31 2004 
Analog Inputs: 
C-01:   0.0 ˙˙ AC-02:   5.1 ˙˙ AC-03:   6.4 ˙˙ AC-04:   6.3 ˙˙ AC-05:   5.5 ˙˙ AC-06:   6.3 ˙˙ A 
C-07:  14.1 ˙˙ AC-08: 180.0 ˙˙ AC-09: 180.0 ˙˙ AC-10:  15.8 ˙˙ AC-11: 180.0 ˙˙ AC-12:  15.6 ˙˙ A 
C-13: 180.0 ˙˙ AC-14:  13.6 ˙˙ AC-15:  68.2 ˙˙ AC-16:  62.3 ˙˙ AC-17:  58.4 ˙˙ AC-18:   0.0 ˙˙ A 
C-19:   0.0 ˙˙ AC-20: 180.0 ˙˙ AC-21:  60.2 ˙˙ AC-22: 180.0 ˙˙ AC-23:  40.7 ˙˙ AC-24:  15.2 ˙˙ A 
C-25:  16.5 ˙˙ AC-26:  10.7 ˙˙ A 
Analog Outputs: 
C-01:   0.0 ˙˙ AC-02:   0.0 ˙˙ AC-03:   0.0 ˙˙ A 
Relais: 1: 0, 2: 0, 3: 0, 4: 0 
Data-Next: <far>0027:00E0H 

Measure:    3  Time: Mar 23 12:05:31 2004 
Analog Inputs: 
C-01:   0.0 ˙˙ AC-02:   5.4 ˙˙ AC-03:   6.3 ˙˙ AC-04:   6.3 ˙˙ AC-05:   5.6 ˙˙ AC-06:   6.2 ˙˙ A 
C-07:  14.1 ˙˙ AC-08: 180.0 ˙˙ AC-09: 180.0 ˙˙ AC-10:  15.7 ˙˙ AC-11: 180.0 ˙˙ AC-12:  15.6 ˙˙ A 
C-13: 180.0 ˙˙ AC-14:  14.0 ˙˙ AC-15:  67.8 ˙˙ AC-16:  63.1 ˙˙ AC-17:  59.7 ˙˙ AC-18:   0.0 ˙˙ A 
C-19:   0.0 ˙˙ AC-20: 180.0 ˙˙ AC-21:  47.0 ˙˙ AC-22: 180.0 ˙˙ AC-23:  41.3 ˙˙ AC-24:  15.2 ˙˙ A 
C-25:  16.5 ˙˙ AC-26:  11.6 ˙˙ A 
Analog Outputs: 
C-01:   0.0 ˙˙ AC-02:   0.0 ˙˙ AC-03:   0.0 ˙˙ A 
Relais: 1: 0, 2: 0, 3: 0, 4: 0 
Data-Next: <far>0027:0150H


C-01 bis C-26 sind die benötigten Messwerte (im Format x.x, xx.x bzw. xxx.x) die ich dem jeweiligem Datensatz zuordnen möchte. Die Textdatei beginnt mit Measure: 1 und geht bis Measure: 4096. Hoffe Ihr habt ein paar Tipps für mich!
Wäre über eure Hilfe sehr dankbar!!

Mit freundlichen Grüßen

Flo
atarigold
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 84

WIN XP, Linux 2.4
D7, Delphi 2006 Prof
BeitragVerfasst: Fr 21.05.04 14:07 
Die Textdatei ist zumindest brauchbar strukturiert, so dass das Umwandeln nicht so schwierig sein dürfte.

Hier die Vorgehensweise, wie ich's machen würde:

1. Datei öffnen,

2. in einer while oder until-Schleife bis zum Ende (eof) die Datei (zeilenweise mit Readln) einlesen, hierbei


2.1 nach 'measure:' suchen ---> Funktion pos

--> wenn nicht gefunden nächste Zeile

2.2 die nächsten fünf ascii-Zeichen einlesen --> Funktion copy , und in integer umwandeln --> Funktion strtoint


2.3 nach 'Time: ' suchen ---> Funktion pos

Datum einlesen - und nach Wunsch aufbereiten z. B. Umwandlung in deutsches Datumsformat

2.4 zur übernachsten Zeile springen;

2.5. Hier eine Schleife for i:=1 to 26 do .......

2.5.1 mit pos nach 'C-0'+inttostr(i)+':' bzw. für Zahlen >9 'C-'+inttostr(i)+':' suchen, die nächsten fünf
ASCI-Zeichen auslesen (Funktion copy) und mit strtofloat in eine Gleitkommazahl umwandeln.

2.5.2 Jetzt Datum, Messwert in z. B. eine Datenbank, oder Array oder .... speichern.


weiter punkt 2.


Kleiner Tipp noch:
Um Probleme mit dem Dezimaltrennzeichen zu vermeiden solltest du jeweils vor dem Einlesen
decimalseparator:='.' setzen und ggf. vor Weiterverarbeitung auf decimalseparator:=',' zurücksetzen.
molnarflo Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 21.05.04 15:45 
Besten Dank für deine Tipps!!

Werd das ganze mal ausprobieren!
molnarflo Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 21.05.04 16:24 
Titel: Problem mit "POS"
Hab das ganze einmal probiert und irgendwie nur über die Zwischenablage geschafft. Das ganze funktioniert aber leider nicht weil mir das Programm sehr schnell abstürzt. Hat jemand dazu einen Verbesserungsvorschlag?

ausblenden volle Höhe 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:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
for  idx:=Anfang To Ende Do
    begin
      if idx<1000 then
        begin
          T:=IntToStr(idx);
          L:='Measure:  '+T;
        end
      else
        begin
          T:=IntToStr(idx);
          L:='Measure: '+T;
        end;

    Table1.Append;
    j:=pos(L,Memo1.Text);
    if j > 0 then
    begin
      Memo1.SetFocus;
      Memo1.SelStart := J-1;
      Memo1.SelLength := 600;
      Memo1.copyToClipboard;
      Memo2.clear;
      Memo2.PasteFromClipboard;
      Memo1.SelText:='';
      Table1.FieldValues['Monat'] :=  copy(Memo2.Text,pos(L,Memo2.Text)+21,3);
      Table1.FieldValues['Tag'] := copy(Memo2.Text,pos(L,Memo2.Text)+25,2);
      Table1.FieldValues['Jahr'] := copy(Memo2.Text,pos(L,Memo2.Text)+37,4);
      Table1.FieldValues['Zeit'] := copy(Memo2.Text,pos(L,Memo2.Text)+28,8);
      Table1.FieldValues['C01'] :=  copy(Memo2.Text,pos('C-01',Memo2.Text)+6,5);
      Table1.FieldValues['C02'] :=  copy(Memo2.Text,pos('C-02',Memo2.Text)+6,5);
      Table1.FieldValues['C03'] :=  copy(Memo2.Text,pos('C-03',Memo2.Text)+6,5);
      Table1.FieldValues['C04'] :=  copy(Memo2.Text,pos('C-04',Memo2.Text)+6,5);
      Table1.FieldValues['C05'] :=  copy(Memo2.Text,pos('C-05',Memo2.Text)+6,5);
      Table1.FieldValues['C06'] :=  copy(Memo2.Text,pos('C-06',Memo2.Text)+6,5);
      Table1.FieldValues['C07'] :=  copy(Memo2.Text,pos('C-07',Memo2.Text)+6,5);
      Table1.FieldValues['C08'] :=  copy(Memo2.Text,pos('C-08',Memo2.Text)+6,5);
      Table1.FieldValues['C09'] :=  copy(Memo2.Text,pos('C-09',Memo2.Text)+6,5);
      Table1.FieldValues['C10'] :=  copy(Memo2.Text,pos('C-10',Memo2.Text)+6,5);
      Table1.FieldValues['C11'] :=  copy(Memo2.Text,pos('C-11',Memo2.Text)+6,5);
      Table1.FieldValues['C12'] :=  copy(Memo2.Text,pos('C-12',Memo2.Text)+6,5);
      Table1.FieldValues['C13'] :=  copy(Memo2.Text,pos('C-13',Memo2.Text)+6,5);
      Table1.FieldValues['C14'] :=  copy(Memo2.Text,pos('C-14',Memo2.Text)+6,5);
      Table1.FieldValues['C15'] :=  copy(Memo2.Text,pos('C-15',Memo2.Text)+6,5);
      Table1.FieldValues['C16'] :=  copy(Memo2.Text,pos('C-16',Memo2.Text)+6,5);
      Table1.FieldValues['C17'] :=  copy(Memo2.Text,pos('C-17',Memo2.Text)+6,5);
      Table1.FieldValues['C18'] :=  copy(Memo2.Text,pos('C-18',Memo2.Text)+6,5);
      Table1.FieldValues['C19'] :=  copy(Memo2.Text,pos('C-19',Memo2.Text)+6,5);
      Table1.FieldValues['C20'] :=  copy(Memo2.Text,pos('C-20',Memo2.Text)+6,5);
      Table1.FieldValues['C21'] :=  copy(Memo2.Text,pos('C-21',Memo2.Text)+6,5);
      Table1.FieldValues['C22'] :=  copy(Memo2.Text,pos('C-22',Memo2.Text)+6,5);
      Table1.FieldValues['C23'] :=  copy(Memo2.Text,pos('C-23',Memo2.Text)+6,5);
      Table1.FieldValues['C24'] :=  copy(Memo2.Text,pos('C-24',Memo2.Text)+6,5);
      Table1.FieldValues['C25'] :=  copy(Memo2.Text,pos('C-25',Memo2.Text)+6,5);
      Table1.FieldValues['C26'] :=  copy(Memo2.Text,pos('C-26',Memo2.Text)+6,5);
    end;


Das mit der Zwischenablage hatte damals den Sinn, dass nur immer eine Messung in einem eigenen Memo steht und ich daher mit dem POS nicht durcheinanderkomme. Wenn ich mich recht erinnere hat POS nämlich immer nur die Daten der ersten Messung erfasst weil es immer vom Dateianfang an gesucht hat.