A #0 B #0 C #13#10
のように#0で区切られたテキストファイルを
(実際のデータに空白はありません)
以下のようなカンマ区切りに変更したいのですが
A,B,C#13#10
どうすればいいでしょうか?
TStringlistを使うと最初の#0までしか
読み込んでもらえないので困っています。
WideStringかな?
Stringは#0を扱えなかったと思います。
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 型の変数に転写します。
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;
皆様ありがとうございました。
kさんの方法でうまくいきました。
メモリストリームでは、変数に内容をコピーしたり、メモリに書き込んだりする
のをポインタをつかって簡単高速にできます。
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;
ツイート | ![]() |