string 如何在字符串中存储和加载键值对列表?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/16908741/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-09 01:57:19  来源:igfitidea点击:

How do I store and load a list of key-value pairs in a string?

stringdelphitstringlist

提问by S F

I have a list of strings and the values they are to be replaced with. I'm trying to combine them in a list like 'O'='0',' .'='.', ...so it's easy for me to edit it and add more pairs of replacements to make.

我有一个字符串列表以及要替换它们的值。我正在尝试将它们组合在一个列表中,这样'O'='0',' .'='.', ...我很容易编辑它并添加更多的替换对。

Right now the best way I could think of it is:

现在我能想到的最好方法是:

var
  ListaLimpeza : TStringList;
begin
  ListaLimpeza := TStringList.Create;

  ListaLimpeza.Delimiter := '|';
  ListaLimpeza.QuoteChar := '"';
  ListaLimpeza.DelimitedText := 'O=0 | " .=."';

  ShowMessage('1o Valor = '+ListaLimpeza.Names[1]+' e 2o Valor = '+ListaLimpeza.ValueFromIndex[1]);

This works, but it's not good for visuals, since I can't code the before string (for ex ' .') like that (which is very visual for the SPACE character), only like (" .) so that the =works to assign a name and value in the TStringList.

这有效,但对视觉效果不好,因为我无法像那样编码前字符串(例如 ex ' .')(这对于 SPACE 字符非常直观),只能像 ( " .) 这样=分配名称和值的作品在 TStringList 中。

回答by Ken White

The Namesand Valuesby default have to be separated by =, in the style of Windows INI files. There's no way AFAICT to change that separator.As @SirRufo indicates in the comment (and which I had never noticed), you can change that using the TStringList.NameValueSeparatorproperty.

默认情况下,NamesValues必须以 , 分隔=,就像 Windows INI 文件一样。AFAICT 无法更改该分隔符。正如@SirRufo 在评论中指出的(我从未注意到),您可以使用该TStringList.NameValueSeparator属性更改它。

This will give you an idea of what Delphi thinks is in your TStringList, which is not what you think it is:

这将使您了解 Delphi 认为您的TStringList.

procedure TForm1.FormCreate(Sender: TObject);
var
  SL: TStringList;
  Temp: string;
  i: Integer;
begin
  SL := TStringList.Create;
  SL.Delimiter := '|';
  SL.QuoteChar := '"';
  SL.StrictDelimiter := True;
  SL.DelimitedText := 'O=0 | ! .!=!.!';
  Temp := 'Count: ' + IntToStr(SL.Count) + #13;
  for i := 0 to SL.Count - 1 do
    Temp := Temp + Format('Name: %s Value: %s'#13, 
              [SL.Names[i], SL.ValueFromIndex[i]]);
  ShowMessage(Temp);
end;

This produces this output:

这会产生以下输出:

Sample ShowMessage output from above code

来自上述代码的示例 ShowMessage 输出

TStringListNames/Values probably isn't going to do what you need. It's not clear what your actual goal is, but it appears that a simple text file with a simple list of text|replacementand plain parsing of that file would work, and you can easily use TStringListto read/write from that file, but I don't see any way to do the parsing easily except to do it yourself. You could use an array to store the pairs when you parse them:

TStringListNames/Values 可能不会做你需要的。目前尚不清楚您的实际目标是什么,但似乎带有该文件的简单列表text|replacement和简单解析的简单文本文件可以工作,您可以轻松地使用TStringList该文件读取/写入,但我看不到除了自己做之外,任何可以轻松进行解析的方法。解析它们时,您可以使用数组来存储这些对:

type
  TReplacePair = record
    TextValue: string;
    ReplaceValue: string;
  end;

  TReplacePairs = array of TReplacePair;

function GetReplacementPairs: TReplacePairs;
var
  ConfigInfo: TStringList;
  i, Split: Integer;
begin
  ConfigInfo := TStringList.Create;
  try
    ConfigInfo.LoadFromFile('ReplacementPairs.txt');
    SetLength(Result, ConfigInfo.Count);
    for i := 0 to ConfigInfo.Count - 1 do
    begin
      Split := Pos('|`, ConfigInfo[i];
      Result[i].TextValue := Copy(ConfigInfo[i], 1, Split - 1);
      Result[i].ReplaceValue := Copy(ConfigInfo[i], Split + 1, MaxInt);
    end;
  finally
    ConfigInfo.Free;
  end;
end;

You can then populate whatever controls you need to edit/add/delete the replacement pairs, and just reverse the read operation to write them back out to save.

然后,您可以填充编辑/添加/删除替换对所需的任何控件,只需反转读取操作即可将它们写回以进行保存。