使用 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 变量,这意味着它是未定义的。