2012-04-02 7 views
3

Ich bin neu in Delphi Codierung und Struggeling in .txt-Dateien lesen. Ich versuche Eingabedaten (Tabbed Doubles) aus einer .txt-Datei zu lesen, in der jede Spalte als Variable (Tag, Temperatur, Druck, ...) betrachtet wird und jede Zeile als Zeitschritt (Stunde) betrachtet wird. Wie kann ich diese Daten in ein Array einlesen, um stündlich mit diesen Variablen zu rechnen (Zeile für Zeile)?Lesen von Double-Daten aus TXT-Dateien in Arrays in Delphi

Vielen Dank für einen Rat!

Eingangsprobe (Doubles in TXT-Datei mit Registerkarten):

1 0.5 0 -12.6 -1.39 100 -19.5 0 3.3 
1 1 0 -12.6 -1.43 100 -19.8 0 3.3 
1 1.5 0 -12.7 -1.51 99.9 -20.5 0 3.2 

Was ich bisher (VCL Formularanwendung):

var    // Declaration of variables 
    Read: TRead; 
    i:Byte; 
    data:array of array of Integer; //Creation of dynamic array (adapts --> Setlength() command) 
    Input:TextFile; 
    Location:String; 
    Counter:Integer; 
    Maximum:Integer; 

procedure TRead.Button1Click(Sender: TObject); // Button "Read" command 

begin 
    Location:=Edit1.Text;       // Path of inputfile from Form 
    AssignFile(Input,(Location+'\Test1.txt')); // Assigning inputfile 
    Reset(Input);        // Open for read-write 
    If (IoResult = 0) Then Begin     // If Inputfile reading was succesful... 
    Counter:=1; 
    While Not EoF(Input) Do Begin 
     ReadLn(Input,i); 
     Data[Counter]:=i; 
     If EoF(Input) Then Break; 
     Inc(Counter);  //increase 'Counter' by 1 
    End; 
    End 

    Else WriteLn('Error when reading the file') 
    CloseFile(Input); 
    End; 

    Begin 
    For i:=1 To 10 Do WriteLn(data[i]); 
    ReadLn; 
    End. 
+2

Bitte senden Sie den Inhalt der txt, oder zumindest eine Probe. –

+2

Seit wann ist -12.7 eine ganze Zahl? –

Antwort

5

Delphi hat immer noch die sehr alt (fashioned) pascal lesen Verfahren für Textvariablen, so dass Sie direkt in Ihrem Array lesen kann :)

Var NumArray: Array[1..9] of double; // you have 9 variables 

while not eof(F) do begin 
    read(F,NumArray[1],NumArray[2],NumArray[3],NumArray[4],NumArray[5],NumArray[6],NumArray[7],NumArray[8],NumArray[9]); 
    // store it somewhere; 
end; 
+3

ReadLn wäre korrekter :) –

+0

Wenn es 9 vars pro Zeile gibt, wird dies das gleiche tun - aber es ist schon lange her, dass ich eine Datei auf diese Weise lese :) – Despatcher

+0

Dies (mit der ReadIn () Befehl) half mir gut! Hurra für einfache alte Vintage-Lösungen! :) Danke! – JelleH

10

Ich würde es tun TStringList mit der analysieren Datei in Zeilen und SplitString, um jeden abgegrenzten Wert zu symbolisieren.

Zunächst einmal die Datei in eine String-Liste zu laden:

var 
    Strings: TStringList; 
.... 
Strings := TStringList.Create; 
try 
    Strings.LoadFromFile(FileName); 
    ProcessStrings(Strings); 
finally 
    Strings.Free; 
end; 

Und dann eigentlich die Fäden zu verarbeiten:

procedure ProcessStrings(Strings: TStrings); 
var 
    line, item: string; 
    items: TStringDynArray; 
    value: Double; 
begin 
    for line in Strings do 
    begin 
    items := SplitString(line, #9#32);//use tab and space as delimiters 
    for item in items do 
    begin 
     value := StrToFloat(item); 
     //do something with value 
    end; 
    end; 
end; 

Obwohl Ihr Titel die Daten beschreibt, wie integer es scheint zu sein, gemischte Ganzzahl und Fließkommazahl. Wie auch immer, ich denke, Sie sollten in der Lage sein, die Lücken auszufüllen und Ihre dynamischen Wertefelder aufzufüllen, die Fehlerprüfung zu übernehmen und so weiter.

+0

Die Textdatei enthält Floats. Sollte es irgendwo eine StrToFloat-Konvertierung geben? –

+0

@John Ja, das stimmt. Der Titel der Frage bezieht sich auf Ganzzahlen und ich habe den Inhalt der Datei nicht zu genau studiert. –

+2

+ 1ed, aber vielleicht würde ich 'TStreamReader' und' TryStrToFloat' bevorzugen, um besser schlafen zu können :-) – TLama