お世話になっております。
固定長のテキストファイルを読み込んでその改行コードを判別したいのですが、
(CFLF か CR か LF か)
こんなときはどのようなファイルオープンの方法が一般的でしょうか。
…以下のコードだと改行コードが読み込まれず判別できませんでした
procedure TForm1.Button1Click(Sender: TObject);
var
F : TextFile;
S : string;
e : integer;
m : string;
begin
OpenDialog1.Execute;
AssignFile(F, OpenDialog1.FileName);
Reset(F);
Readln(F, S);
e := length(S);
if #13 = S[e] then m := 'CR'
else
if #10 = S[e] then
if #13 <> S[e-1] then m := 'CRLF'
else m := 'LF';
Showmessage(s + ' : ' + m);
CloseFile(F);
end;
Readlnでは行末の改行を読み込みませんよ
Ansiposか何かでやるのが良いかと?
こんばんわです。
簡単なサンプルです。
procedure TForm1.Button1Click(Sender: TObject);
var
F: File;
Buffer: array of Byte;
i,Char13,Char10,Char1310:integer;
begin
Char13 :=0;
Char10 :=0;
Char1310 :=0;
AssignFile(F, 'c:\test.dat');
Reset(F, 1);
SetLength(Buffer, FileSize(F));
BlockRead(F, Buffer[0], FileSize(F));
i:=0;
repeat
if Buffer[i]= $0D then
begin
if Buffer[i+1]= $0A then
begin
Char1310:= Char1310+1;
i:=i+1;
end else
Char13 := Char13+1;
end else
if Buffer[i]= $0A then
Char10 := Char10+1;
i:=i+1;
until i>=FileSize(F);
CloseFile(F);
Showmessage('CRLF '+inttostr(Char1310));
Showmessage('CR '+inttostr(Char13));
Showmessage('LF '+inttostr(Char10));
end;
るるとん@Kさん
Ansiposを使ってやる方法の
ソースを教えてくれませんか?
今PDAで環境が無いんですが、
CRLFを探し、無かったときは
CRとLFを探すという風にやればできるかと思います
こんな感じ
procedure TForm1.Button1Click(Sender: TObject);
var
LFPos,CRPos:integer;
begin
LFPos:=ansipos(#10,Memo1.Text);
CRPos:=ansipos(#13,Memo1.Text);
if CRPos=LFPos-1 then Showmessage('CRLF');
if (CRPos=0) and (LFPos>0) then Showmessage('LF');
if (LFPos=0) and (CRPos>0) then Showmessage('CR');
end;
改行が無い場合CRLF以外でCRとLFが混ざってる場合は何もしません
> るるとん@K
> 固定長のテキストファイルを読み込んで
この部分の答えにはなっていないよ
固定長なら、改行コードに位置は分かっているはず。
固定長でしたか
ではansiposは不要ですね
procedure TForm1.Button1Click(Sender: TObject);
var
LFPos,CRPos:integer;
L:integer;
T:string;
begin
L:=10;//改行コードを除いた1行の長さ
T:=Memo1.Text;
case T[L+1] of
#10 :Showmessage('LF');
#13 :if T[L+2]=#10 then Showmessage('CRLF') else Showmessage('CR');
end;
end;
これで可能かと思います
> これで可能かと思います
本当に試しましたか?
Memo1.Lines.Text にしてしまうと改行は CRLF になってしまうよ。
procedure TForm1.Button1Click(Sender: TObject);
var
s,T:string;
L:integer;
begin
s := '0123456789'+#10+'0123456789';
Memo1.Lines.Text := s;
L:=10;//改行コードを除いた1行の長さ
T :=Memo1.Text;
case T[L+1] of
#10 :Showmessage('LF');
#13 :if T[L+2]=#10 then Showmessage('CRLF') else Showmessage('CR');
end;
end;
>Memo1.Lines.Text にしてしまうと改行は CRLF になってしまうよ。
試す際に、Memoで試しただけで、
>T :=Memo1.Text
は、実際は読み込んだ文字列を使えばいいです。
>本当に試しましたか?
CR、LFそれぞれ挿入するボタンを作って試しました。
Memo1.Textを使ったのはよくなかったですね。すみません。
ファイルから読み込んで、固定長を10バイトとした場合は、例えば
こんな感じのテキストをつくったとして
procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
ms:TMemoryStream;
begin
s := '0123456789'+#10+'0123456789';
ms := TMemoryStream.Create;
try
ms.Write(s[1],Length(s));
ms.SaveToFile('c:\Test.txt');
finally
ms.Free;
end;
end;
これを以下のようにして読み込むと
procedure TForm1.Button2Click(Sender: TObject);
var
ms:TMemoryStream;
c:Char;
begin
ms := TMemoryStream.Create;
try
ms.LoadFromFile('c:\Test.txt');
ms.Position := 10; // 固定長を10と仮定
ms.Read(c,1);
case c of
#10 :Showmessage('LF');
#13 :begin
ms.Read(c,1);
if c=#10 then Showmessage('CRLF') else Showmessage('CR');
end;
end;
finally
ms.Free;
end;
end;
ちゃんと Showmessage('LF'); が実行されます。
虚血性大腸炎で入院しておりました。
数日でよくなり退院できました。
これから、教えていただいたことを試してみます。
ありがとうございました。
わからないことがあれば、また書き込みますので
よろしくお願いいたします。
ツイート | ![]() |