我在.txt文件中给出了21个y坐标(在Delphi读取的单个字符串中),这些坐标是在.txt文档中垂直写入的。如何将此字符串拆分为单个值并将其存储在数组中?#34; Farr"?文本文档内容如下所示:
-3
-2.5
-2
...
每个值都需要存储到0 ... 21的常规数组中,如下所示:
Farr:=[-3, -2.5, -2, ...]
谢谢!
答案 0 :(得分:6)
试试这个:
var
sl: TStringList;
i: integer;
s: string;
arr: array of double;
begin
sl := TStringList.Create;
try
sl.LoadFromFile(FilePath);
SetLength(arr, sl.Count);
for i := 0 to sl.Count - 1 do
arr[i] := StrToFloat(sl[i]);
finally
sl.Free;
end;
end;
答案 1 :(得分:2)
注意:当我写这个答案时,问题声称多个值出现在一行中,用空格分隔。显然这些信息是错误的。
这个问题有很多部分。请在阅读文档后阅读本答复。有关这方面的一些有用的提示可以在这里找到:How can I search for Delphi documentation?
阅读文件
有很多方法可以做到这一点。也许最简单和最常见的方法是使用TStringList
。创建一个,并调用LoadFromFile
传递文本文件的名称。
拆分字符串
同样,有很多选择。我可能会选择像StrUtils.SplitString
这样的分割函数。
如果您的字符串str
包含以空格分隔的值,则可以执行以下操作:
var
Values: TStringDynArray;
....
Values := SplitString(str, ' ');
当然,现在看起来每行文件都有一个值。在这种情况下,您不需要拆分任何字符串。
将值从字符串转换为实际
请使用StrToFloat
。
var
RealValue: Real;
....
RealValue := StrToFloat(StringValue);
这将使用本地用户的区域设置。如果与小数分隔符不匹配,这可能会让您头疼。如果小数分隔符总是,例如.
,那么你需要指定它。
var
RealValue: Real;
FormatSettings: TFormatSettings;
....
FormatSettings := TFormatSettings.Create;
FormatSettings.DecimalSeparator := '.';
RealValue := StrToFloat(StringValue, FormatSettings);
如果StrToFloat
因任何原因失败,则会引发异常。作为替代方案,您可以使用TryStrToFloat
来表示使用其Boolean
返回值失败。例如:
if not TryStrToFloat(StringValue, RealValue, FormatSettings) then
.... deal with error
答案 2 :(得分:1)
您可以使用正则表达式来获取匹配数和匹配项。 这是执行此操作的代码,尽管您可能想要更改正则表达式:
MyRegexp := TRegEx.Create('[-+]?[0-9]*\.?[0-9]+');
with MyRegexp.Matches do
if Count = 21 then //As you always want 21 items
for i := 0 to 20 do
FArr[i] := StrToFloat(Item[i]);
当然应该添加错误处理,但这是你想要的基础。此外,如果列表由空格,分号等分隔,则可以,这取决于您的正则表达式。