Inno Setup create array from comma delimited strings stored in an array

瘦欲@ 提交于 2019-12-23 06:12:19

问题


I need to create an array from a number of comma delimited strings which are stored in an array themselves. The master array which contains the list of comma delimited strings is RemoteSiteLines and can contain any number of string entries like 1001,Remote Site 1,REM1,0, 1002,Remote Site 2,REM2,1 etc. which I need to get into another array RemoteSiteDetailsLines.

I am struggling to know even where to start with this and unless I am mistaken there are no built-in functions to do something like this in Inno Setup. Can anyone suggest a procedure for doing this?


回答1:


Use a two-dimensional array like array of array of string.

Parsing can be done like below. It's not the most efficient code, but it's relatively simple and short.

procedure ParseArray(Lines: array of string; var Tokens: array of array of string);
var
  Count, Index, Index2, P: Integer;
  Line: string;
begin
  Count := GetArrayLength(Lines);
  // Allocate target array
  SetArrayLength(Tokens, Count);

  // Iterate lines
  for Index := 0 to Count - 1 do
  begin
    Line := Lines[Index];
    Log(Format('Line[%d]: %s', [Index, Line]));

    Index2 := 0;
    // Loop until we consume whole line
    while Line <> '' do
    begin
      // Look for the next delimiter
      P := Pos(',', Line);
      // Reallocate array to fit yet another token
      SetArrayLength(Tokens[Index], Index2 + 1);
      if P > 0 then
      begin
        // Copy the token to the target array
        Tokens[Index][Index2] := Copy(Line, 1, P - 1);
        // Remove the token and the delimiter from the string,
        // so that we can look for the next token in the next iteration
        Delete(Line, 1, P);
      end
        else
      begin
        Tokens[Index][Index2] := Line;
        // Got last token, break the loop
        Line := '';
      end;

      Log(Format('Token[%d][%d]: %s', [Index, Index2, Tokens[Index][Index2]]));
      Inc(Index2);
    end;
  end;
end;

// Usage example
procedure InitializeWizard();
var
  RemoteSiteLines: array of string;
  RemoteSiteDetailsLines: array of array of string;
begin
  SetArrayLength(RemoteSiteLines, 3);
  RemoteSiteLines[0] := '1001,Remote Site 1,REM1,0';
  RemoteSiteLines[1] := '1002,Remote Site 2,REM2,0';
  RemoteSiteLines[2] := '1003,Remote Site 3,REM3,0';
  ParseArray(RemoteSiteLines, RemoteSiteDetailsLines);
end;

The result will be like:

Line[0]: 1001,Remote Site 1,REM1,0
Token[0][0]: 1001
Token[0][1]: Remote Site 1
Token[0][2]: REM1
Token[0][3]: 0
Line[1]: 1002,Remote Site 2,REM2,0
Token[1][0]: 1002
Token[1][1]: Remote Site 2
Token[1][2]: REM2
Token[1][3]: 0
Line[2]: 1003,Remote Site 3,REM3,0
Token[2][0]: 1003
Token[2][1]: Remote Site 3
Token[2][2]: REM3
Token[2][3]: 0


来源:https://stackoverflow.com/questions/32722161/inno-setup-create-array-from-comma-delimited-strings-stored-in-an-array

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!