我试图在一行中的InnoSetup中的子字符串后得到一个特定的整数。有Trim,TrimLeft,TrimRight函数,但没有子串提取函数。
示例:
line string: 2345
line another string: 3456
我想提取“2345”和“3456”。
我正在加载数组中的文件内容,但无法通过数组[count] [char_count]取消引用它。
答案 0 :(得分:7)
我会将输入文件加载到TStrings
集合并逐行迭代。对于每一行,我会找到一个":"
字符位置,从这个位置我将复制我最终修剪的字符串。步骤:
1. line string: 2345
2. 2345
3. 2345
现在仍然要将此字符串转换为整数并将其添加到最终集合中。由于你在文件样本中显示了一个空行,并且由于你没有说过这种格式是否总是被修复,所以让我们以安全的方式转换这个字符串。 Inno Setup为这个安全转换提供了一个函数StrToIntDef
。但是,此函数需要一个默认值,该值在转换失败时返回,因此您必须向其调用传递一个值,这是您在文件中永远不会想到的值。在下面的示例中,我选择了-1
,但您可以将其替换为输入文件中您从未预料到的任何其他值:
[Code]
type
TIntegerArray = array of Integer;
procedure ExtractIntegers(Strings: TStrings; out Integers: TIntegerArray);
var
S: string;
I: Integer;
Value: Integer;
begin
for I := 0 to Strings.Count - 1 do
begin
// trim the string copied from a substring after the ":" char
S := Trim(Copy(Strings[I], Pos(':', Strings[I]) + 1, MaxInt));
// try to convert the value from the previous step to integer;
// if such conversion fails, because the string is not a valid
// integer, it returns -1 which is treated as unexpected value
// in the input file
Value := StrToIntDef(S, -1);
// so, if a converted value is different from unexpected value,
// add the value to the output array
if Value <> -1 then
begin
SetArrayLength(Integers, GetArrayLength(Integers) + 1);
Integers[GetArrayLength(Integers) - 1] := Value;
end;
end;
end;
procedure InitializeWizard;
var
I: Integer;
Strings: TStringList;
Integers: TIntegerArray;
begin
Strings := TStringList.Create;
try
Strings.LoadFromFile('C:\File.txt');
ExtractIntegers(Strings, Integers);
for I := 0 to GetArrayLength(Integers) - 1 do
MsgBox(IntToStr(Integers[I]), mbInformation, MB_OK);
finally
Strings.Free;
end;
end;