【问题标题】:Searching i TStringList using POS - need more advanced method使用 POS 搜索 i TStringList - 需要更高级的方法
【发布时间】:2016-03-14 13:12:54
【问题描述】:

我使用以下函数来搜索我从文件中读取的 TStringList。 我知道当我搜索一个值时,我需要的返回值总是在我搜索的项目之后的那一行。 它一直使用 POS 进行搜索,但现在文件已扩展,我必须查找 2 项“Adresse”和“Adresse 2” 这给了我一个问题,因为 pos 在这两种情况下都找到了“地址”,然后我的数据是错误的。

是否有另一种方法可以在字符串中搜索我不知道的子字符串,或者我必须自己制作。

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

【问题讨论】:

  • 如果您能向我们展示输入数据格式的样子,那就太好了。告诉我们它不是 HTML 或 JSON 之类的......
  • 我已经把文本文件的样本放在了有问题的地方,但它看起来像....
  • 只搜索 "Adresse:" 而不是 "Adresse" ??
  • 还有,当你找到字符串时,你为什么一直在寻找?找到字符串时退出循环 - 添加“Break;”设置结果后
  • the input to the TStringList comes from a textfile extracted from a HTML file. ...人们想知道未提取的 HTML 是什么样的。您是否通过删除可能与 HTML 解析器一起使用的标签来客观地获取您所追求的信息而使您的工作变得更加困难?

标签: delphi search tstringlist


【解决方案1】:

在我看来,真正的错误是您的搜索过于松懈。为什么接受部​​分匹配?寻找完全匹配似乎更可靠

if SameText(aSearch, Infolist[Counter]) then

或者可能是为了说明前导和尾随空格:

if SameText(aSearch, Trim(Infolist[Counter])) then

您需要传递'Adresse:''Adresse 2:' 作为搜索字符串,或者在搜索函数中添加冒号。

如果您想进行区域敏感比较,请使用AnsiSameText。如果您想要区分大小写的比较等,请使用=

您可能会传递多个搜索字符串,并且只能在文件上循环一次。就目前而言,您阅读了两次,这似乎很浪费。确实肯定更好地在字符串列表上操作,而不是与文件存储耦合。

例如,您返回数据中的最后一个匹配项,而不是第一个匹配项。如果有多个匹配项怎么办?您的代码是否按预期运行?

您还应该注意,如果未找到匹配项,您的函数不会分配给 Result 变量,这意味着它是未定义的。

【讨论】:

  • 我已经调整了您的输入,现在我认为它几乎可以做到最好。我现在最糟糕的问题是我搜索的内容可能会在文件中出现 2 次(已经在来自 frekvensregister.erst.dk/Search/Result.aspx?CS=oz8hp 的 HTML 中),这是我的下一个任务来排序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-07
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多