uMain.pas 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. unit uMain;
  2. interface
  3. uses
  4. Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, System.IOUtils, System.IniFiles,
  5. Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, IdStream, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  6. IdHTTP, System.DateUtils, Generics.Collections, Generics.Defaults, Vcl.ComCtrls;
  7. type
  8. TForm1 = class(TForm)
  9. lbledtURL: TLabeledEdit;
  10. btnDownloadLogfiles: TButton;
  11. lbledtMaxLogfilesOnServer: TLabeledEdit;
  12. lbledtTargetDirectory: TLabeledEdit;
  13. idhtp1: TIdHTTP;
  14. lbledtCsvFile: TLabeledEdit;
  15. redtLog: TRichEdit;
  16. lblImpressum: TLabel;
  17. procedure btnDownloadLogfilesClick(Sender: TObject);
  18. procedure FormCreate(Sender: TObject);
  19. procedure FormDestroy(Sender: TObject);
  20. private
  21. { Private declarations }
  22. mINI: TINIFile;
  23. function DownloadFile(pURL: string; pDestFileName: string): boolean;
  24. function LoadValue(const pFileName: string): Extended;
  25. procedure LoadCSV(const pFileName: string);
  26. procedure SaveCSV(const pFileName: string);
  27. procedure LoadINI;
  28. procedure WriteINI;
  29. public
  30. { Public declarations }
  31. end;
  32. var
  33. Form1: TForm1;
  34. implementation
  35. {$R *.dfm}
  36. procedure TForm1.btnDownloadLogfilesClick(Sender: TObject);
  37. var
  38. lclDateString: string;
  39. lclFilenameCsv: string;
  40. lclFilenameTxtOld: string;
  41. i: Integer;
  42. lclValue: Extended;
  43. begin
  44. redtLog.Clear;
  45. LoadCSV(lbledtCsvFile.Text);
  46. for i := StrToInt(lbledtMaxLogfilesOnServer.Text) downto 1 do
  47. begin
  48. DateTimeToString(lclDateString, 'yyyy-mm-dd', incDay(Now, - i));
  49. lclFilenameCsv := 'data_' + lclDateString + '.csv'; // http://192.168.10.65/fileserver/log/data/data_2022-11-28.csv
  50. lclFilenameTxtOld := 'log_' + lclDateString + '.txt'; // http://192.168.10.65/fileserver/log/message/log_2022-11-10.txt
  51. if (redtLog.FindText(lclDateString, 0, Length(redtLog.Lines.Text), [stWholeWord]) = -1) then
  52. begin
  53. if DownloadFile(lbledtURL.Text + 'data/' + lclFilenameCsv, lbledtTargetDirectory.Text + lclFilenameCsv) then
  54. begin
  55. lclValue := LoadValue(lbledtTargetDirectory.Text + lclFilenameCsv);
  56. redtLog.Lines.Add(lclDateString + ';' + FloatToStrF(lclValue, ffFixed, 8, 2));
  57. end
  58. else if DownloadFile(lbledtURL.Text + 'message/' + lclFilenameTxtOld, lbledtTargetDirectory.Text + lclFilenameTxtOld) then
  59. begin
  60. lclValue := LoadValue(lbledtTargetDirectory.Text + lclFilenameTxtOld);
  61. redtLog.Lines.Add(lclDateString + ';' + FloatToStrF(lclValue, ffFixed, 8, 2));
  62. end;
  63. end;
  64. end;
  65. SaveCSV(lbledtCsvFile.Text);
  66. end;
  67. procedure TForm1.LoadCSV(const pFileName: string);
  68. var
  69. Txt: TextFile;
  70. s: string;
  71. begin
  72. if FileExists(pFileName) then
  73. begin
  74. AssignFile(Txt, pFileName);
  75. Reset(Txt);
  76. while not Eof(Txt) do
  77. begin
  78. Readln(Txt, s);
  79. redtLog.Lines.Add(s);
  80. end;
  81. CloseFile(Txt);
  82. end
  83. else
  84. begin
  85. redtLog.Lines.Add('Date;Value');
  86. end;
  87. end;
  88. procedure TForm1.LoadINI;
  89. begin
  90. lbledtURL.Text := mINI.ReadString('MAIN', 'URL', 'http://192.168.10.65/fileserver/log/message/');
  91. lbledtMaxLogfilesOnServer.Text := mINI.ReadString('MAIN', 'CountLogfiles', '30');
  92. lbledtTargetDirectory.Text := mINI.ReadString('MAIN', 'Log', 'C:\Temp\Gas\');
  93. lbledtCsvFile.Text := mINI.ReadString('MAIN', 'CsvFile', 'C:\Temp\Gas\Values.csv');
  94. end;
  95. function TForm1.LoadValue(const pFileName: string): Extended;
  96. var
  97. Txt: TextFile;
  98. s: string;
  99. lclStringList: TStringList;
  100. lclStartPos: Integer;
  101. lclEndPos: Integer;
  102. begin
  103. Result := 0;
  104. lclStringList := TStringList.Create;
  105. try
  106. AssignFile(Txt, pFileName);
  107. Reset(Txt);
  108. while not Eof(Txt) do
  109. begin
  110. Readln(Txt, s);
  111. if ExtractFileExt(pFileName) = '.csv' then
  112. begin
  113. if (AnsiPos('no error', s) <> 0) then
  114. begin
  115. lclStringList.Clear;
  116. lclStringList.Delimiter := ';';
  117. s := StringReplace(s, ',', ';', [rfReplaceAll, rfIgnoreCase]);
  118. s := StringReplace(s, '.', ',', [rfReplaceAll, rfIgnoreCase]);
  119. lclStringList.DelimitedText := s;
  120. Result := lclStringList[2].ToExtended;
  121. end;
  122. end
  123. else
  124. begin
  125. if (AnsiPos('Value: ', s) <> 0) and (AnsiPos(' Error: no error', s) <> 0) then
  126. begin
  127. lclStartPos := AnsiPos('Value: ', s) + 7;
  128. lclEndPos := AnsiPos(' Error: no error', s) - lclStartPos;
  129. s := StringReplace(s, '.', ',', [rfReplaceAll, rfIgnoreCase]);
  130. Result := StrToFloat(Copy(s, lclStartPos, lclEndPos));
  131. end;
  132. end;
  133. end;
  134. finally
  135. CloseFile(Txt);
  136. FreeAndNil(lclStringList);
  137. end;
  138. end;
  139. procedure TForm1.SaveCSV(const pFileName: string);
  140. begin
  141. TFile.WriteAllText(pFileName, redtLog.Lines.Text);
  142. end;
  143. procedure TForm1.WriteINI;
  144. begin
  145. mINI.WriteString('MAIN', 'URL', lbledtURL.Text);
  146. mINI.WriteString('MAIN', 'CountLogfiles', lbledtMaxLogfilesOnServer.Text);
  147. mINI.WriteString('MAIN', 'Log', lbledtTargetDirectory.Text);
  148. mINI.WriteString('MAIN', 'CsvFile', lbledtCsvFile.Text);
  149. end;
  150. function TForm1.DownloadFile(pURL: string; pDestFileName: string): boolean;
  151. var
  152. Http: TIdHTTP;
  153. FS: TFileStream;
  154. begin
  155. Result := true;
  156. ForceDirectories(ExtractFileDir(pDestFileName));
  157. FS := TFileStream.Create(pDestFileName, fmCreate);
  158. try
  159. try
  160. Http := TIdHTTP.Create(nil);
  161. try
  162. Http.Get(pURL, FS);
  163. finally
  164. Http.Free;
  165. end;
  166. finally
  167. FS.Free;
  168. end;
  169. except
  170. DeleteFile(pDestFileName);
  171. Exit(false);
  172. end;
  173. end;
  174. procedure TForm1.FormCreate(Sender: TObject);
  175. begin
  176. mINI := TINIFile.Create(ExtractFilePath(ParamStr(0)) + 'config.ini');
  177. LoadINI;
  178. redtLog.Clear;
  179. lblImpressum.Caption := 'reserve, 2022' + #13#10 + 'free to copy and modify'
  180. end;
  181. procedure TForm1.FormDestroy(Sender: TObject);
  182. begin
  183. WriteINI;
  184. FreeAndNil(mINI);
  185. end;
  186. end.