Чтение данных Double из файлов .txt в массивы в Delphi - PullRequest
3 голосов
/ 02 апреля 2012

Я новичок в кодировании Delphi и борюсь за чтение файлов .txt. Я пытаюсь прочитать входные данные (с двойными вкладками) из файла .txt, в котором каждый столбец рассматривается как переменная (день, температура, давление, ...), а каждая строка рассматривается как шаг по времени (час). Как я могу прочитать эти данные в массив, чтобы выполнять почасовые вычисления с этими переменными (строка за строкой)?

Большое спасибо за любые советы!

Пример ввода (с вкладками Doubles в файле .txt):

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

Что у меня есть (приложение VCL Form):

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 ]

10 голосов
/ 02 апреля 2012

Я бы сделал это, используя TStringList для разбора файла на строки и SplitString для токенизации каждого значения с разделителями.

Прежде всего, чтобы загрузить файл в список строк:

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

А затем обработать строки:

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;

Несмотря на то, что ваш заголовок описывает данные как целочисленные, представляется, что они представляют собой смешанные целое число и число с плавающей запятой. В любом случае, я думаю, вы должны быть в состоянии заполнить пробелы и заполнить ваши динамические массивы значений, обработать проверку ошибок и т. Д.

5 голосов
/ 02 апреля 2012

В Delphi все еще есть очень старая (старомодная) процедура чтения паскаля для текстовых переменных, так что вы можете читать в своем массиве напрямую:)

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;
...