#0で区切られたデータを扱うには?

解決


こけたく  2005-06-17 09:36:45  No: 15723

A #0 B #0 C #13#10
のように#0で区切られたテキストファイルを
(実際のデータに空白はありません)
以下のようなカンマ区切りに変更したいのですが
A,B,C#13#10
どうすればいいでしょうか?
TStringlistを使うと最初の#0までしか
読み込んでもらえないので困っています。


#0  2005-06-17 09:46:45  No: 15724

WideStringかな?
Stringは#0を扱えなかったと思います。


えと  2005-06-17 12:22:52  No: 15725

procedure TForm1.Button1Click(Sender: TObject);
var
  s: string;
  i: integer;
begin
  s := 'A'#0'B'#0'C'#13#10;
  for i := 1 to Length(s) do if s[i] = #0 then s[i] := ',';
  Label1.Caption := s;
end;

#0 を特別扱いするのは、string 型の変数やプロパティーに代入するとき、または
PChar にキャストするとき。それ以外は普通に扱えます。

ファイルの場合は TMemoryStream で読み込んで、#0 を ',' に変換したのち
string 型の変数に転写します。


k  2005-06-17 17:29:19  No: 15726

procedure TForm1.Button1Click(Sender: TObject);
  var
    sStream: TStringStream;
    MemStream : TMemoryStream;
    ch : Char;
    RoopSize ,RoopPosition : Int64;

    s: string;
begin
   s := 'A'#0'B'#0'C'#13#10;

  MemStream:= TMemoryStream.Create;
  sStream:= TStringStream.Create('');
  try
  // 文字を代入
  MemStream.WriteBuffer(s[1],Length(s));
//  MemStream.LoadFromStream();

  RoopSize := MemStream.Size;
  MemStream.Position := 0;
  RoopPosition := 0;
  With MemStream do
  While (RoopPosition <= RoopSize-1) do
  begin
    ReadBuffer(ch ,1);
    if Ord(ch) = 0 then
    begin
      Position := RoopPosition;
      ch := ',';
      Write(ch ,1);
     // Position := RoopPosition+1;
    end;
    RoopPosition := RoopPosition +1;
  end;

  // 文字を取り出し
  sStream.CopyFrom(MemStream,0);

  Edit1.Text :=
      sStream.DataString;

  finally
    MemStream.Free;
    sStream.Free;
  end;
end;


こけたく  2005-06-17 18:49:32  No: 15727

皆様ありがとうございました。
kさんの方法でうまくいきました。


えと  2005-06-17 20:20:15  No: 15728

メモリストリームでは、変数に内容をコピーしたり、メモリに書き込んだりする
のをポインタをつかって簡単高速にできます。

procedure TForm1.Button1Click(Sender: TObject);
var
  s: string;
  ms: TMemoryStream;
  p: PByte;
  i: integer;
begin
  s := 'A'#0'B'#0'C'#13#10;
  ms := TMemoryStream.Create;
  try
    ms.Write(s[1], Length(s));
    p := ms.Memory;
    for i := 0 to ms.Size-1 do
    begin
      if p^ = 0 then p^ := 44;
      inc(p);
    end;
    ms.Position := 0;
    ms.Read(s[1],ms.Size);
    Memo1.Text := s;
  finally
    ms.Free;
  end;
end;


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加