Splitting a TXT File

Question:
I want to split a TXT file into smaller TXT files. The program should split the file every time there are three empty lines. For example:

Paragraph1Paragraph2

Paragraph1 and Paragraph 2 would become separate text files. I would be grateful if you could tell me which commands I should use or even build such program if it isn’t too difficult.

Answer:
That’s an interesting problem. Assuming that you won’t ever need to go back to an original file, you can use the same file variable to handle all the destination files. It’s just a matter of counting. Here’s wrapper procedure that ought to work.

procedure CreateABunchOfFiles(SourceFile : String);var  fSource,  fDest       : TextFile;  buf         : String;  BlankCounter,  DestCounter : Integer;begin  //Let's initialize the variables  DestCounter := 1;  BlankCounter := 1;  AssignFile(fSource, SourceFile);  Reset(fSource);  AssignFile(fDest, 'Dest' + IntToStr(DestCounter) + '.TXT');  Rewrite(fDest);  //Now go through the file line by line  while NOT EOF(fSource) do begin    ReadLn(fSource, buf);    //Make sure we remove all trailing and leading spaces    //to catch blank lines. If we come across a blank line,    //then skip the rest of processing and move to the next    //one. This is ultra important because some text files'    //blank lines contain spaces or null characters, they'll    //be read as real bytes.    if (TrimLeft(TrimRight(buf)) = '') then        Inc(BlankCounter);    else      //Okay, we've come across three blank lines in a row      if (BlankCounter = 3) then        begin          //Reset the counter          BlankCounter := 1;          //Close current destination file          CloseFile(fDest);          //Increment the Destination File ID (DestCounter)          Inc(DestCounter);          //Open up a new file based on the new name          AssignFile(fDest, 'Dest' + IntToStr(DestCounter) +'.TXT');          Rewrite(fDest);        end      else        //Otherwise, just write the line to the currentdestination        WriteLn(fDest, buf);  end;end;

This solution is pretty straightforward File I/O stuff, so I won’t go into detail here. Look over the logic to understand how it works. I commented it pretty well so you can follow it easily.

Share the Post:
Share on facebook
Share on twitter
Share on linkedin

Overview

Recent Articles: