改行コードを判別したいのですが

解決


固まる  2004-05-01 01:38:28  No: 8790

お世話になっております。
固定長のテキストファイルを読み込んでその改行コードを判別したいのですが、
(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;


るるとん@K  2004-05-01 03:28:39  No: 8791

Readlnでは行末の改行を読み込みませんよ
Ansiposか何かでやるのが良いかと?


スタテツ  2004-05-01 03:41:56  No: 8792

こんばんわです。
簡単なサンプルです。

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;


L  2004-05-01 04:53:53  No: 8793

るるとん@Kさん
Ansiposを使ってやる方法の
ソースを教えてくれませんか?


るるとん@K  2004-05-01 05:05:51  No: 8794

今PDAで環境が無いんですが、
CRLFを探し、無かったときは
CRとLFを探すという風にやればできるかと思います


るるとん@K  2004-05-02 03:35:54  No: 8795

こんな感じ
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が混ざってる場合は何もしません


qq  2004-05-03 01:31:14  No: 8796

> るるとん@K

> 固定長のテキストファイルを読み込んで

この部分の答えにはなっていないよ


qq  2004-05-03 01:32:20  No: 8797

固定長なら、改行コードに位置は分かっているはず。


るるとん@K  2004-05-03 02:03:53  No: 8798

固定長でしたか
では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;
これで可能かと思います


qq  2004-05-03 07:06:01  No: 8799

> これで可能かと思います

本当に試しましたか?
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;


るるとん@K  2004-05-03 07:16:21  No: 8800

>Memo1.Lines.Text にしてしまうと改行は CRLF になってしまうよ。
試す際に、Memoで試しただけで、
>T :=Memo1.Text
は、実際は読み込んだ文字列を使えばいいです。
>本当に試しましたか?
CR、LFそれぞれ挿入するボタンを作って試しました。
Memo1.Textを使ったのはよくなかったですね。すみません。


qq  2004-05-03 07:20:59  No: 8801

ファイルから読み込んで、固定長を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'); が実行されます。


固まる  2004-05-20 00:11:37  No: 8802

虚血性大腸炎で入院しておりました。
数日でよくなり退院できました。
これから、教えていただいたことを試してみます。
ありがとうございました。
わからないことがあれば、また書き込みますので
よろしくお願いいたします。


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

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






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