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

String 如何在字符串中存储和加载键值对列表?,string,delphi,tstringlist,String,Delphi,Tstringlist,我有一个字符串列表和要替换的值。我正在尝试将它们合并到一个列表中,如'O'='0'、'.'='、…,这样我就可以轻松地编辑它并添加更多的替换项 现在我能想到的最好办法是: var ListaLimpeza : TStringList; begin ListaLimpeza := TStringList.Create; ListaLimpeza.Delimiter := '|'; ListaLimpeza.QuoteChar := '"'; ListaLimpeza.Deli

我有一个字符串列表和要替换的值。我正在尝试将它们合并到一个列表中,如
'O'='0'、'.'='、…
,这样我就可以轻松地编辑它并添加更多的替换项

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

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]);

这是可行的,但对视觉效果不好,因为我不能像这样编码before字符串(对于ex
“.
)(对于空格字符来说非常直观),而只能像(
)因此,
=
可以在TStringList中指定一个名称和值。

默认情况下,
名称和
值必须以Windows INI文件的样式用
=
分隔。无法更改该分隔符。正如@SirRufo在注释中指出的(我从未注意到),您可以使用
TStringList.NameValueSeparator
属性更改它

这将让您了解德尔福认为您的
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;
这将产生以下输出:

TStringList
Names/Values可能无法满足您的需要。您的实际目标还不清楚,但似乎一个简单的文本文件,其中包含一个简单的
text列表,可以替换该文件并对其进行简单解析,您可以轻松地使用
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;

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

如果您在示例中使用标准分隔符和引号字符,您的帖子将更易于阅读。如果您使用它们,您的示例代码是否有效?我怀疑您是未能在DelimitedText作业中正确使用这些字符。但当我遇到奇怪的字符选择时,我放弃了尝试解开您的示例。建议:如果您坚持使用标准默认值,而不是|和!,您将在SA上获得更好的响应,除非您无法使标准出现问题。也许吧这里的其他人会有足够的头脑和胆量来挖掘你的。我已经做了一些编辑,我相信现在更容易理解了。请检查一下。你是否考虑过将列表的编辑方式与存储方式分开?对于编辑,尝试使用两列网格,这样你就不必担心引用或分隔。然后,存储字符串你想要的。不要担心以一种易于阅读的格式存储它们;只要确保你的程序可以毫不含糊地加载它们就行了。如果你使用JSON之类的东西,这会容易得多。你正在尝试重新发明轮子。我已经回滚了你上次的编辑,因为它改变了问题的全部含义和意图。一次问题已收到答案,您不能更改整个问题,因为它会使答案无效你已经收到了。如果你现在有一个关于字符串替换的问题,应该作为一个新的单独问题发布。你可以从那里链接回这个问题,以了解上下文和历史。是的,我理解。我相信我需要使用另一种方法,我正在考虑使用:
“|O|=|0 |,| |=| | |,…”
然后使用代码将其拆下,以便识别正确的替换。有没有更简单的解决方案可以给我一个这样的可视代码?我添加了一个解决方案的建议,但是
TStringList
的内置功能不会有帮助。thoug,你可以创建自己的后代来为你这样做h、 NameValueSeparator字符可以通过使用TStrings.NameValueSeparator属性@SirRufo:Thank伙计,我不知道这个属性,这会让我的生活更轻松:)@SirRufo:I也从来没有注意到这个属性(我显然不需要它)。谢谢。我更新了我的答案(当然有适当的信用)。