1

これは、このトピックの新しい質問です。

キーと値のペアのリストを文字列に保存して読み込むにはどうすればよいですか?

私は次のコードに来ました:

procedure TForm1.BotaoLimpaClick(Sender: TObject);
var
  ListaSubstituicoes, Atual: String;
  ListaLimpeza, Pares: TStringList;
  i: Integer; //('O' , ' .' , '.' , '/' , '-');

begin
  ListaSubstituicoes := '|O| = |0| , | .| = |.| , . , / , -';

  TextoCompleto := Trim(EditTexto.Text);
  ListaLimpeza := TStringList.Create;
  Pares := TStringList.Create;

  ExtractStrings([','],[], PChar(ListaSubstituicoes), ListaLimpeza);
  for i := 0 to (ListaLimpeza.Count - 1) do
  begin
    Atual := ListaLimpeza[i];
    Atual := Trim(Atual);
    if Pos('=', Atual) = 0 then
    begin
      TextoCompleto := 
        StringReplace(TextoCompleto, Atual, '', [rfReplaceAll, rfIgnoreCase]);
      Continue;
    end;

    Pares.Clear;
    ExtractStrings(['='],[], PChar(Atual), Pares);
    Pares.Text := 
      StringReplace(Pares.Text, '|', '', [rfReplaceAll, rfIgnoreCase]);
    //Pares[1] := StringReplace(Pares[1], '|', '', [rfReplaceAll, rfIgnoreCase]);
    TextoCompleto := 
      StringReplace(TextoCompleto, Pares[0], Pares[1], [rfReplaceAll, rfIgnoreCase]);
  end;

それは私を夢中にさせています。以下に適用すると:

75691 .30698 02053447138 05764.100011 5 572500000382o0

それは簡単には機能しません!'.306' 空白は削除されず、ステートメントの最後にある o は 0 に置き換えられません。何故ですか?StringReplace が正しく機能していないことに関係していると思いますが、おそらく ' ' 空白を尊重していません。手がかりはありますか?

Pares[0] は正しく 'O' 値を取得しており、Pares[1] は正しく '0' を取得しています。トレースインで確認しました。しかし、奇妙な TextoCompleto := StringReplace(TextoCompleto, Pares[0], Pares[1], [rfReplaceAll, rfIgnoreCase]);ことに、置き換えの望ましい結果が得られませ572500000382o057250000038200

4

2 に答える 2

2

私がフォローできる限り、望ましい結果についてはわかりません...

const
  ListaSubstituicoes = 'O=0, .=.';
var
  ListaLimpeza: TStringList;
  i: Integer;
  TextoCompleto:String;
begin

      TextoCompleto := Trim(EditTexto.Text);
      ListaLimpeza := TStringList.Create;
      try
      ExtractStrings([','],[], PChar(ListaSubstituicoes), ListaLimpeza);
      for i := 0 to (ListaLimpeza.Count - 1) do
        begin
            TextoCompleto := StringReplace(TextoCompleto, ListaLimpeza.Names[i], ListaLimpeza.ValueFromIndex[i], [rfReplaceAll, rfIgnoreCase]);
        end;
      Caption := TextoCompleto; // test
      finally
         ListaLimpeza.Free;
      end;
end;

あなたのコメントとリンクを参照すると、おそらくこのようなものを探しているでしょう。もちろん"、たとえば次のように置き換えることができます|

const
  ListaSubstituicoes = '"O"="0"," ."="."';
var
  ListaLimpeza: TStringList;
  i: Integer;
  TextoCompleto:String;
begin
      TextoCompleto := Trim(EditTexto.Text);
      ListaLimpeza := TStringList.Create;
      try
      ExtractStrings([','],[], PChar(StringReplace(ListaSubstituicoes,'"','',[rfReplaceAll])), ListaLimpeza);
      for i := 0 to (ListaLimpeza.Count - 1) do
        begin
            TextoCompleto := StringReplace(TextoCompleto, ListaLimpeza.Names[i], ListaLimpeza.ValueFromIndex[i], [rfReplaceAll, rfIgnoreCase]);
        end;
     Caption := TextoCompleto;
      finally
         ListaLimpeza.Free;
      end;
end;
于 2013-06-04T13:07:18.543 に答える
0

くそ、コードが機能しない唯一の原因は、トリムの欠如でした。

StringReplace( -> Trim <- (Pares.Text), '|', '', [rfReplaceAll, rfIgnoreCase]);

しかし、Pares.Textそのような作業は適切なコーディングではないと考えているため、次のように置き換えました。

ExtractStrings(['='],[], PChar(Atual), Pares);
Pares[0] := StringReplace(Trim(Pares[0]), '|', '', [rfReplaceAll, rfIgnoreCase]);
Pares[1] := StringReplace(Trim(Pares[1]), '|', '', [rfReplaceAll, rfIgnoreCase]);

魅力のように機能します。

于 2013-06-04T21:08:17.227 に答える