【问题标题】:Delphi: extract value from string with multiple separators and delimitersDelphi:从具有多个分隔符和定界符的字符串中提取值
【发布时间】:2021-11-22 03:54:05
【问题描述】:

我有一个这样的字符串:

;EncoderMin:250;EncoderMax:5755;MinPixel:-240;MaxPixel:980;

给定一个返回变体类型并接受属性类型作为参数的函数(例如 EncoderMin),我希望该函数返回属性的值,因此在本例中为 250

我正在使用此代码,但我无法处理 2 个分隔符。第一个分隔符应该是 ';'分隔每个属性,第二个分隔符应该是 ':' 将属性与其值分开。

function TFrameLayout3DSTD.GetAttributiSTD(ALoc: Integer;
  AField: String; AVarType: Word): Variant;
var
  Q: TADOQuery;
  LLista : TStringList;
begin
  Result := null;

  Q := DMConn.GetQuery(
    'select AttributiSTD from Locazioni3D where idLocazione = %d', [ALoc]);
  try
    Q.Open;
    LLista := TStringList.Create;
    try
      LLista.Delimiter := ';';
      LLista.StrictDelimiter := True;
      LLista.DelimitedText := Q.Fields[0].AsString;

      Result := LLista.Values[AField];
    finally
      LLista.Free;
    end;
  finally
    Q.Free;
  end;
end;

其中 Q.Fields[0].AsString 等于 ;EncoderMin:250;EncoderMax:5755;MinPixel:-240;MaxPixel:980;

【问题讨论】:

  • 只需添加一个LLista.NameValueSeparator := ':';

标签: delphi delimiter separator tstringlist


【解决方案1】:

我想通了,我必须使用 strict delimiter = true 并且我的字符串值不应使用 ':' 分隔,而是使用 '=' 分隔。

Delphi 自动识别等号!

谢谢。

【讨论】:

  • 我不明白:您已经在问题中设置了.StrictDelimiter := True。
【解决方案2】:

另一种选择是拆分和索引文本。

uses
   System.SysUtils, System.StrUtils, System.Variants;
var
  txt: string;
  arr: TArray<string>;
  i  : integer;
  v  : variant;
begin
  try
    v  := null;
    txt := ';z:250;a:17;EncoderMin:250;EncoderMax:5755;MinPixel:-240;MaxPixel:980;';
    arr := txt.Split([';', ':']);

    i  := IndexText('EncoderMin', arr);
    if i >= 0 then
      v := arr[succ(i)];
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;

【讨论】:

    猜你喜欢
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多