用的是分块读入或写入的方式,虽然占用内存,但在海量文本文件处理时,对磁盘i/o造成的瓶颈,有相当的改善,部分算法取自TStrings.
抱歉,贴出来以后,缩进都乱套了,我本来很注意缩进的
基类TFileParser ,另外还有几个文件读写类从这个类派生,此处不再一一贴上。这些文件解析类其实有个管理器TFileParserManager,在此也不再贴上
unit uniFileParser;
{$I Include.inc}
interface
uses
Classes;
type
{ TFileParser }
TFileParser = class(TObject)
private
protected
FManager:TObject;
FFileName:string;
public
function Open(const FileName: string):Boolean;virtual;abstract;
procedure Close;virtual;abstract;
function Save(const FileName: string):Boolean;virtual;abstract;
function Flush:Boolean;virtual;abstract;
constructor Create(AManager:TObject);
destructor Destroy; override;
published
property FileName:string read FFileName;
end;
implementation
uses
uniFileParserManager;
{ TFileParser }
constructor TFileParser.Create(AManager: TObject);
begin
FManager:=AManager;
end;
destructor TFileParser.Destroy;
begin
if Assigned(FManager)then //当开发者直接用了free时,这里来弥补;建议调用管理器的delete过程
begin
TFileParserManager(FManager).AbandonFileParser(Self);
end;
inherited;
end;
end.
单元,子类TMemDelimitedTextFile
感觉写的有点乱,以后有空时再改进吧,反正好用就成
unit uniDelimitedTextFile;
{$I Include.inc}
interface
uses
Windows, Messages, SysUtils, Variants, Classes,
uniFileParser;
type
TStringArray=array of string;
TDelimitedTextDealType=(dtdtClosed,dtdtRead,dtdtWrite);
{ TDelimitedTextFile }
TCustomDelimitedTextFile = class(TFileParser)
private
protected
FLastError:string;
FImportItem:TStringList;
FFileSi