libdo

Untitled

Sep 21st, 2017
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 8.96 KB | None | 0 0
  1. unit parseCSV;
  2.  
  3. interface
  4.  
  5. uses Classes, SysUtils, Winapi.Windows;
  6.  
  7. type
  8.     // Уточнить размерность полей
  9.     TCSVLine = record             // Для Маяка
  10.         ctype         : byte;
  11.         widget        : byte;
  12.         elements_numb : byte;
  13.         range_min     : extended;
  14.         range_typical : extended;
  15.         range_max     : extended;
  16.         data_size     : byte;
  17.         name_full     : string[255];
  18.         name          : string[255];
  19.         units         : string[255];
  20.         desc          : string[255];
  21.         enums_numb    : byte;
  22. //      _unknown:       byte;
  23.     end;
  24.     TPCSVLine= ^TCSVLine;
  25.  
  26.     TCSVData = array of TCSVLine;
  27.  
  28.     TCSVParser = class
  29.         private
  30.           const CSV_DELIMITER = ';'; // Разделитель полей в CSV файле
  31.         private
  32.             _iLength: integer;
  33.             _pData: TCSVData;
  34.             _pStrParser: TstringList;
  35.  
  36.     private
  37.       procedure _parseLine(const _sLine: string);
  38.       function GetData(Const _iIndex: integer): TCSVLine;
  39.  
  40.     public
  41.       property Count: integer read _iLength;
  42.       Property Data[const _iIndex: integer]: TCSVLine read GetData; default;
  43.  
  44.     public
  45.       procedure ParseFile(const _sPath: string); overload;
  46.       procedure ParseFile(const _pList: TStringList); overload;
  47.  
  48.     public
  49.             constructor Create; overload;
  50.             destructor Destroy; override;
  51.     end;
  52.  
  53. // Для АТГС
  54.     TCSVLine_ATGS = record
  55.         number_telem  : string[255];
  56.         name_telem    : string[255];
  57.         param1        : string[255];
  58.         param2        : string[255];
  59.         param3        : string[255];
  60.         param4        : string[255];
  61.         param5        : string[255];
  62.     param6        : string[255];
  63.         param7        : string[255];
  64.         param8        : string[255];
  65.         param9        : string[255];
  66.         param10        : string[255];
  67.     param11        : string[255];
  68.         param12        : string[255];
  69.         param13        : string[255];
  70.         param14        : string[255];
  71.         param15        : string[255];
  72.     param16        : string[255];
  73.         param17        : string[255];
  74.         param18        : string[255];
  75.         param19        : string[255];
  76.         param20        : string[255];
  77.     param21        : string[255];
  78.         param22        : string[255];
  79.         param23        : string[255];
  80.         param24        : string[255];
  81.         param25        : string[255];
  82.     end;
  83.   TPCSVLine_ATGS= ^TCSVLine_ATGS;
  84.  
  85.   TCSVData_ATGS = array of TCSVLine_ATGS;
  86.  
  87.   TCSVParser_ATGS = class
  88.         private
  89.           const CSV_DELIMITER_ATGS = ';'; // Разделитель полей в CSV файле
  90.         private
  91.             _iLength_ATGS: integer;
  92.             _pData_ATGS: TCSVData_ATGS;
  93.             _pStrParser_ATGS: TstringList;
  94.  
  95.     private
  96.       procedure _parseLine_ATGS(const _sLine_ATGS: string);
  97.       function GetData_ATGS(Const _iIndex_ATGS: integer): TCSVLine_ATGS;
  98.  
  99.     public
  100.       property Count_ATGS: integer read _iLength_ATGS;
  101.       Property Data_ATGS[const _iIndex_ATGS: integer]: TCSVLine_ATGS read GetData_ATGS; default;
  102.  
  103.     public
  104.       procedure ParseFile_ATGS(const _sPath_ATGS: string); overload;
  105.       procedure ParseFile_ATGS(const _pList_ATGS: TStringList); overload;
  106.  
  107.     public
  108.             constructor Create; overload;
  109.             destructor Destroy; override;
  110.     end;
  111.  
  112. implementation
  113.  
  114. function s2b(const _s: string): byte;
  115. begin
  116.   Result := ord(_s[1]) - 48; // ord('0') == 48
  117. end;
  118.  
  119. procedure TCSVParser._parseLine(const _sLine: string);
  120. var
  121.   i : Integer;
  122. begin
  123.   Self._pStrParser.DelimitedText := _sLine;
  124.   SetLength(Self._pData, Self.Count + 1);
  125.  
  126.   Self._pData[Self.Count].ctype         := s2b(Self._pStrParser[1]);
  127.   Self._pData[Self.Count].widget        := s2b(Self._pStrParser[2]);
  128.   Self._pData[Self.Count].elements_numb := s2b(Self._pStrParser[3]);
  129.   Self._pData[Self.Count].range_min     := StrToFloatDef(Self._pStrParser[4], 0);
  130.   Self._pData[Self.Count].range_typical := StrToFloatDef(Self._pStrParser[5], 0);
  131.   Self._pData[Self.Count].range_max     := StrToFloatDef(Self._pStrParser[6], 0);
  132.   Self._pData[Self.Count].data_size     := s2b(Self._pStrParser[7]);
  133.   Self._pData[Self.Count].name_full     := Self._pStrParser[8];
  134.   Self._pData[Self.Count].name          := Self._pStrParser[9];
  135.   Self._pData[Self.Count].units         := Self._pStrParser[10];
  136.   Self._pData[Self.Count].desc          := Self._pStrParser[11];
  137.   Self._pData[Self.Count].enums_numb    := s2b(Self._pStrParser[12]);
  138. //  Self._pData[Self.Count]._unknown      := s2b(Self._pStrParser[13]);
  139.  
  140.   Inc(Self._iLength);
  141. end;
  142.  
  143. function TCSVParser.GetData(const _iIndex: integer): TCSVLine;
  144. begin
  145.   if ((_iIndex < 0) or (_iIndex >= Self.Count)) then raise ERangeError.Create('List index out of bounse');
  146.   Result := Self._pData[_iIndex];
  147. end;
  148.  
  149. procedure TCSVParser.ParseFile(const _sPath: string);
  150. var
  151.   pFile: TStringList;
  152. begin
  153.   pFile := TStringList.Create;
  154.   pFile.LoadFromFile(_sPath);
  155.   Self.ParseFile(pFile);
  156.   pFile.Free;
  157. end;
  158.  
  159. procedure TCSVParser.ParseFile(const _pList: TStringList);
  160. var
  161.   sLine: string;
  162. begin
  163.   for sLine in _pList do begin
  164.     // TODO: Add callback to prevent gui locking
  165.     Self._parseLine(sLine);
  166.   end;
  167. end;
  168.  
  169. constructor TCSVParser.Create;
  170. begin
  171.     inherited;
  172.  
  173.   Self._iLength := 0;
  174.   SetLength(Self._pData, Self._iLength);
  175.   Self._pStrParser := TstringList.Create;
  176.   Self._pStrParser.Delimiter := CSV_DELIMITER;
  177.   Self._pStrParser.StrictDelimiter:= True;
  178. end;
  179.  
  180. destructor TCSVParser.Destroy;
  181. begin
  182.   Self._pStrParser.Free;
  183.   SetLength(Self._pData, 0);
  184.  
  185.     inherited;
  186. end;
  187.  
  188.  
  189. // ДЛЯ АТГС
  190. procedure TCSVParser_ATGS._parseLine_ATGS(const _sLine_ATGS: string);
  191. var
  192.   i : Integer;
  193. begin
  194.   Self._pStrParser_ATGS.DelimitedText := _sLine_ATGS;
  195.   SetLength(Self._pData_ATGS, Self.Count_ATGS + 1);
  196.  
  197.   Self._pData_ATGS[Self.Count_ATGS].number_telem      := Self._pStrParser_ATGS[0];
  198.   Self._pData_ATGS[Self.Count_ATGS].name_telem        := Self._pStrParser_ATGS[1];
  199.   Self._pData_ATGS[Self.Count_ATGS].param1            := Self._pStrParser_ATGS[2];
  200.   Self._pData_ATGS[Self.Count_ATGS].param2            := Self._pStrParser_ATGS[3];
  201.   Self._pData_ATGS[Self.Count_ATGS].param3            := Self._pStrParser_ATGS[4];
  202.   Self._pData_ATGS[Self.Count_ATGS].param4            := Self._pStrParser_ATGS[5];
  203.   Self._pData_ATGS[Self.Count_ATGS].param5            := Self._pStrParser_ATGS[6];
  204.   Self._pData_ATGS[Self.Count_ATGS].param6            := Self._pStrParser_ATGS[7];
  205.   Self._pData_ATGS[Self.Count_ATGS].param7            := Self._pStrParser_ATGS[8];
  206.   Self._pData_ATGS[Self.Count_ATGS].param8            := Self._pStrParser_ATGS[9];
  207.   Self._pData_ATGS[Self.Count_ATGS].param9            := Self._pStrParser_ATGS[10];
  208.   Self._pData_ATGS[Self.Count_ATGS].param10            := Self._pStrParser_ATGS[11];
  209.   Self._pData_ATGS[Self.Count_ATGS].param11            := Self._pStrParser_ATGS[12];
  210.   Self._pData_ATGS[Self.Count_ATGS].param12            := Self._pStrParser_ATGS[13];
  211.   Self._pData_ATGS[Self.Count_ATGS].param13            := Self._pStrParser_ATGS[14];
  212.   Self._pData_ATGS[Self.Count_ATGS].param14            := Self._pStrParser_ATGS[15];
  213.   Self._pData_ATGS[Self.Count_ATGS].param15            := Self._pStrParser_ATGS[16];
  214.   Self._pData_ATGS[Self.Count_ATGS].param16            := Self._pStrParser_ATGS[17];
  215.   Self._pData_ATGS[Self.Count_ATGS].param17            := Self._pStrParser_ATGS[18];
  216.   Self._pData_ATGS[Self.Count_ATGS].param18            := Self._pStrParser_ATGS[19];
  217.   Self._pData_ATGS[Self.Count_ATGS].param19            := Self._pStrParser_ATGS[20];
  218.   Self._pData_ATGS[Self.Count_ATGS].param20            := Self._pStrParser_ATGS[21];
  219.   Self._pData_ATGS[Self.Count_ATGS].param21            := Self._pStrParser_ATGS[22];
  220.   Self._pData_ATGS[Self.Count_ATGS].param22            := Self._pStrParser_ATGS[23];
  221.   Self._pData_ATGS[Self.Count_ATGS].param23            := Self._pStrParser_ATGS[24];
  222.   Self._pData_ATGS[Self.Count_ATGS].param24            := Self._pStrParser_ATGS[25];
  223.   Self._pData_ATGS[Self.Count_ATGS].param25            := Self._pStrParser_ATGS[26];
  224.  
  225.   Inc(Self._iLength_ATGS);
  226. end;
  227.  
  228. function TCSVParser_ATGS.GetData_ATGS(const _iIndex_ATGS: integer): TCSVLine_ATGS;
  229. begin
  230.   if ((_iIndex_ATGS < 0) or (_iIndex_ATGS >= Self.Count_ATGS)) then raise ERangeError.Create('List index out of bounse');
  231.   Result := Self._pData_ATGS[_iIndex_ATGS];
  232. end;
  233.  
  234. procedure TCSVParser_ATGS.ParseFile_ATGS(const _sPath_ATGS: string);
  235. var
  236.   pFile: TStringList;
  237. begin
  238.   pFile := TStringList.Create;
  239.   pFile.LoadFromFile(_sPath_ATGS);
  240.   Self.ParseFile_ATGS(pFile);
  241.   pFile.Free;
  242. end;
  243.  
  244. procedure TCSVParser_ATGS.ParseFile_ATGS(const _pList_ATGS: TStringList);
  245. var
  246.   sLine: string;
  247. begin
  248.   for sLine in _pList_ATGS do begin
  249.     // TODO: Add callback to prevent gui locking
  250.     Self._parseLine_ATGS(sLine);
  251.   end;
  252. end;
  253.  
  254. constructor TCSVParser_ATGS.Create;
  255. begin
  256.     inherited;
  257.  
  258.   Self._iLength_ATGS := 0;
  259.   SetLength(Self._pData_ATGS, Self._iLength_ATGS);
  260.   Self._pStrParser_ATGS := TstringList.Create;
  261.   Self._pStrParser_ATGS.Delimiter := CSV_DELIMITER_ATGS;
  262.   Self._pStrParser_ATGS.StrictDelimiter:= True;
  263. end;
  264.  
  265. destructor TCSVParser_ATGS.Destroy;
  266. begin
  267.   Self._pStrParser_ATGS.Free;
  268.   SetLength(Self._pData_ATGS, 0);
  269.  
  270.     inherited;
  271. end;
  272.  
  273. end.
Add Comment
Please, Sign In to add comment