Solved

Reading UNIX format (LF delimited) text files

Posted on 2002-04-29
5
279 Views
Last Modified: 2010-04-04
In all my Delphi applications dealing with text files so far, I've continued to use the "old" way of accessing files (Open as text, ReadLn, etc.).  The explanation in the manual of the "new" method seemed a little confusing to me, and I guess I was just too lazy to figure it out since I didn't see a benefit to using it.

'Nuff rambling, on to the problem / question:   If ReadLn is used on a LF-delimited file (rather than the DOS CRLF convention) it slurps the entire file in as one "line".  

Can someone provide me a simple & efficient program sample that will open a file, read a LF-delimited line at a time into a string variable, until EOF is reached?   Thanks.
0
Comment
Question by:charles_ebs
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
  • 2
5 Comments
 
LVL 5

Expert Comment

by:alanwhincup
ID: 6978689
I'm not sure but I thought TStringList.LoadFromStream (and LoadFromFile) could read UNIX text files correctly with  recognizing the line endings.
0
 
LVL 5

Accepted Solution

by:
alanwhincup earned 100 total points
ID: 6978703
Just did a search and found this unit which looks like it should be able to do it:

http://www.gnomehome.demon.nl/uddf/pages/conv.htm#conv5

Am still sure TStringList.LoadFromStream/LoadFromFile can handle these though....Can't test right now because have no Delphi on this system.

Cheers,

Alan
0
 
LVL 6

Expert Comment

by:zebada
ID: 6978964
Alan is correct, the LoadFromFile will read $0A delimited strings correctly. For small files probably the easiest way.

Here some (inefficient) code to do what you want.

procedure TForm1.ReadUnixLn(var fd: TextFile; var s: string);
var
  i: integer;
  c: char;
begin
  i := 0;
  while ( not Eof(fd) ) do
  begin
    Read(fd,c);
    if ( c=Chr(10) ) then
      exit;
    SetLength(s,i+1);
    s[i] := c;
    Inc(i);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  fd: TextFile;
  s: string;
begin
  try
    AssignFile(fd,'data.txt');
    FileMode := 0;
    Reset(fd);
    while ( not Eof(fd) ) do
    begin
      ReadUnixLn(fd,s);
      ShowMessage(s);
    end;
  except
    on e:EInOutError do
      ShowMessage(e.Message);
  end;
end;

0
 

Author Comment

by:charles_ebs
ID: 6979368
Oh yeah, forgot to mention that it does need to be able to process huge files, eliminating the solutions that read the whole thing into memory.

I'll take a closer look tomorrow at Alan's UDDF reference and see if I can use it. Thanks for the input so far.
0
 

Author Comment

by:charles_ebs
ID: 6984677
Nice unit; just add it to your program, and call AssignStreamFile instead of AssignFile, and it will read LF-delimited files.  

Only problem is, it doesn't handle CRLF files, and although I didn't make that clear, it needs to be able to handle reading either type.   SO..., here's the revised code section :

//F.Buffer [F.BufEnd] := Data.Buffer^ [Data.BufferOffset] ;
//Inc (Data.BufferOffset) ;
//Inc (F.BufEnd) ;
if Data.Buffer [Data.BufferOffset] <> #13 then
begin
  F.Buffer [F.BufEnd] := Data.Buffer^ [Data.BufferOffset] ;
  Inc (F.BufEnd) ;
end;
Inc (Data.BufferOffset) ;

I also removed the unused "Status" stuff to prevent compiler warnings.  Not necessary, just my preference.

Good enough for me!
0

Featured Post

What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

The uses clause is one of those things that just tends to grow and grow. Most of the time this is in the main form, as it's from this form that all others are called. If you have a big application (including many forms), the uses clause in the in…
Introduction Raise your hands if you were as upset with FireMonkey as I was when I discovered that there was no TListview.  I use TListView in almost all of my applications I've written, and I was not going to compromise by resorting to TStringGrid…
In this video we outline the Physical Segments view of NetCrunch network monitor. By following this brief how-to video, you will be able to learn how NetCrunch visualizes your network, how granular is the information collected, as well as where to f…
Add bar graphs to Access queries using Unicode block characters. Graphs appear on every record in the color you want. Give life to numbers. Hopes this gives you ideas on visualizing your data in new ways ~ Create a calculated field in a query: …
Suggested Courses
Course of the Month7 days, 15 hours left to enroll

617 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question