使用 POS 搜索 i TStringList - 需要更高级的方法
Searching i TStringList using POS - need more advanced method
我使用以下函数来搜索我正在从文件中读取的 TStringList。
我知道当我搜索一个值时,我需要的 return 值总是在我搜索的项目之后的那一行。
它一直使用 POS 进行搜索,但现在文件已扩展,我必须查找 2 项 'Adresse' 和 'Adresse 2'
这给了我一个问题,因为 pos 在这两种情况下都找到 'Adresse',然后我的数据是错误的。
是否有另一种方法可以在字符串中搜索我不知道的子字符串,或者我必须自己创建一个子字符串。
function FindValue(const aFilename, aSearch: string): string;
var
InfoList: TStringList;
Counter: integer;
begin
InfoList := TStringList.Create;
try
InfoList.LoadFromFile(aFilename);
if InfoList.Count > 0 then
for Counter := 0 to InfoList.Count - 1 do
begin
if Pos(aSearch, Infolist.Strings[Counter]) > 0 then
Result := Infolist.Strings[Counter + 1]
end
else
Result := '';
finally
InfoList.Free;
end;
end;
有关信息:TStringList 的输入来自从 HTML 文件中提取的文本文件。
文件示例可以是:
OZ8HP
Hugo Pedersen
Radioamatør
Nykøbing M
Sendeposition:
Adresse:
Prinsensvej 18
Postnummer:
7900
Bynavn:
Nykøbing M
Antenne højde (m):
Kote (m):?Kote (m):Brugerens/tilladelsesindehaverens øvrige adresseoplysninger så som Stednavn og/eller Postboks. Hjælpetegnet * kan anvendes, som beskrevet i hjælp.
Koordinater:
Geografisk anvendelse:
Frekvensmaske:
Tekniske specifikationer:
Sendeeffekt basisstation:
Sendeeffekt mobile anlæg:
Båndbredde (MHz):
Antal anlæg:
MMSI:
Kaldesignaltype:
Personlig
Frekvenskategori:
Udstedelses-metode:
Intention om overdragelse:
Nej
Udløbsdato:
Brugerdata:
Brugernummer:
956078
Adresse:
Prinsensvej 18
Adresse 2:
Sejerslev
Postnr.:
7900
Bynavn:
Nykøbing M
Kaldesignal-kategori:
Bestået A
在我看来,真正的错误似乎是您的搜索过于松懈。为什么接受部分匹配?寻找完全匹配似乎更稳健
if SameText(aSearch, Infolist[Counter]) then
或者可能要考虑前导和尾随空格:
if SameText(aSearch, Trim(Infolist[Counter])) then
您需要传递 'Adresse:'
或 'Adresse 2:'
作为搜索字符串,或者在搜索函数中添加冒号。
如果您想要区分区域设置的比较,请使用 AnsiSameText
。如果你想要区分大小写的比较等,请使用 =
您可以传递多个搜索字符串,并且只能在文件上循环一次。就目前而言,您阅读了两遍,这似乎很浪费。的确,在字符串列表上操作而不是与文件存储耦合肯定更好。
例如,您 return 数据中的最后一个匹配项而不是第一个匹配项。如果有多个匹配怎么办?您的代码是否按预期运行?
您还应注意,如果未找到匹配项,则您的函数不会分配给 Result
变量,这意味着它是未定义的。
我使用以下函数来搜索我正在从文件中读取的 TStringList。 我知道当我搜索一个值时,我需要的 return 值总是在我搜索的项目之后的那一行。 它一直使用 POS 进行搜索,但现在文件已扩展,我必须查找 2 项 'Adresse' 和 'Adresse 2' 这给了我一个问题,因为 pos 在这两种情况下都找到 'Adresse',然后我的数据是错误的。
是否有另一种方法可以在字符串中搜索我不知道的子字符串,或者我必须自己创建一个子字符串。
function FindValue(const aFilename, aSearch: string): string;
var
InfoList: TStringList;
Counter: integer;
begin
InfoList := TStringList.Create;
try
InfoList.LoadFromFile(aFilename);
if InfoList.Count > 0 then
for Counter := 0 to InfoList.Count - 1 do
begin
if Pos(aSearch, Infolist.Strings[Counter]) > 0 then
Result := Infolist.Strings[Counter + 1]
end
else
Result := '';
finally
InfoList.Free;
end;
end;
有关信息:TStringList 的输入来自从 HTML 文件中提取的文本文件。 文件示例可以是:
OZ8HP
Hugo Pedersen
Radioamatør
Nykøbing M
Sendeposition:
Adresse:
Prinsensvej 18
Postnummer:
7900
Bynavn:
Nykøbing M
Antenne højde (m):
Kote (m):?Kote (m):Brugerens/tilladelsesindehaverens øvrige adresseoplysninger så som Stednavn og/eller Postboks. Hjælpetegnet * kan anvendes, som beskrevet i hjælp.
Koordinater:
Geografisk anvendelse:
Frekvensmaske:
Tekniske specifikationer:
Sendeeffekt basisstation:
Sendeeffekt mobile anlæg:
Båndbredde (MHz):
Antal anlæg:
MMSI:
Kaldesignaltype:
Personlig
Frekvenskategori:
Udstedelses-metode:
Intention om overdragelse:
Nej
Udløbsdato:
Brugerdata:
Brugernummer:
956078
Adresse:
Prinsensvej 18
Adresse 2:
Sejerslev
Postnr.:
7900
Bynavn:
Nykøbing M
Kaldesignal-kategori:
Bestået A
在我看来,真正的错误似乎是您的搜索过于松懈。为什么接受部分匹配?寻找完全匹配似乎更稳健
if SameText(aSearch, Infolist[Counter]) then
或者可能要考虑前导和尾随空格:
if SameText(aSearch, Trim(Infolist[Counter])) then
您需要传递 'Adresse:'
或 'Adresse 2:'
作为搜索字符串,或者在搜索函数中添加冒号。
如果您想要区分区域设置的比较,请使用 AnsiSameText
。如果你想要区分大小写的比较等,请使用 =
您可以传递多个搜索字符串,并且只能在文件上循环一次。就目前而言,您阅读了两遍,这似乎很浪费。的确,在字符串列表上操作而不是与文件存储耦合肯定更好。
例如,您 return 数据中的最后一个匹配项而不是第一个匹配项。如果有多个匹配怎么办?您的代码是否按预期运行?
您还应注意,如果未找到匹配项,则您的函数不会分配给 Result
变量,这意味着它是未定义的。