MODULE SplitText; (* ========================================================================= Split the text file 'SplitLines.txt' into a set of files with a specified number of lines Author : Chris Burrows Created: Aug 2007 (c) 2007-2008 CFB Software http://www.cfbsoftware.com/gpcp ========================================================================= *) IMPORT Sys := "[mscorlib]System", IO := "[mscorlib]System.IO", CPmain; (* ==================================================================== *) PROCEDURE CopySubFile(sr: IO.StreamReader; outFile: Sys.String; linesPerFile: INTEGER; VAR eof: BOOLEAN); VAR lineCount: INTEGER; s: Sys.String; sw: IO.StreamWriter; BEGIN lineCount := 0; s := sr.ReadLine(); IF s # NIL THEN sw := IO.StreamWriter.init(outFile); WHILE (s # NIL) & (lineCount < linesPerFile) DO sw.WriteLine(s); INC(lineCount); IF lineCount < linesPerFile THEN s := sr.ReadLine() END END; sw.Close() END; eof := s = NIL END CopySubFile; (* ==================================================================== *) PROCEDURE MakeFileName(fileRoot: Sys.String; fileCount: INTEGER): Sys.String; VAR extension: Sys.String; BEGIN extension := Sys.Convert.ToString(fileCount); extension := extension.PadLeft(3, '0'); RETURN fileRoot + '.' + extension END MakeFileName; (* ==================================================================== *) PROCEDURE SplitFile(inFile: Sys.String; linesPerFile: INTEGER); VAR fileCount: INTEGER; fileRoot, outFile: Sys.String; sr: IO.StreamReader; eof: BOOLEAN; BEGIN sr := IO.StreamReader.init(inFile); eof := FALSE; fileCount := 0; (* File: abc.xxx --> files: abc.001, abc.002, abc.003 etc. *) fileRoot := IO.Path.GetFileNameWithoutExtension(inFile); WHILE ~eof DO INC(fileCount); outFile := MakeFileName(fileRoot, fileCount); CopySubFile(sr, outFile, linesPerFile, eof); END; sr.Close END SplitFile; (* ==================================================================== *) BEGIN SplitFile('SplitLines.txt', 100) END SplitText.