| p; read FUseDelimiter write FUseDelimiter;
//是否有Delimiter。
property SilentExport : Boolean read FSilentExport write FSilentExport;
//若该属性为True,应用程序将不显示数据操作时的异常,而将异常信息通过一个接口传给程序员处理.
property DateFormat : string read FDateFormat write FDateFormat;
//设定CSV文件中日期数据的格式。
property TrimData : Boolean read FTrimData write FTrimData;
//是否去掉数据头尾的空格.
property DefaultInt : Integer read FDefaultInt write FDefaultInt;
//整/实形数据转换出错后的默认值
property BufferSize : LongInt read FBufferSize write FBufferSize;
//CSV 文件的缓冲值,以字节为单位,可以加快导入和导出数据的速度。
//events
property BeforeOpenTable : TNotifyEvent read FBeforeOpenTable write FBeforeOpenTable;
property AfterOpenTable : TNotifyEvent read FAfterOpenTable write FAfterOpenTable;
property BeforeCloseTable : TNotifyEvent read FBeforeCloseTable write FBeforeCloseTable;
property AfterCloseTable : TNotifyEvent read FAfterCloseTable write FAfterCloseTable;
property BeforeEmptyTable : TNotifyEvent read FBeforeEmptyTable write FBeforeEmptyTable;
property AfterEmptyTable : TNotifyEvent read FAfterEmptyTable write FAfterEmptyTable;
property BeforeImport : TNotifyEvent read FBeforeImport write FBeforeImport;
property AfterImport : TNotifyEvent read FAfterImport write FAfterImport;
property BeforeExport : TNotifyEvent read FBeforeExport write FBeforeExport;
property AfterExport : TNotifyEvent read FAfterExport write FAfterExport;
property ExportProgress : TPgCSVProgressEvent read FExportProgress write FExportProgress;
//进程监控事件。每完成一条文本数据的导入就触发该事件。
property ImportProgress : TPgCSVProgressEvent read FImportProgress write FImportProgress;
property OnAddRecord : TNotifyEvent read FOnAddRecord write FOnAddRecord;
property ExportError : TPgCSVExportErrorEvent read FExportError write FExportError;
//发生异常时交由该事件处理,异常信息通过该接口传给程序员。
//methodes
//整个控件的核心内容
procedure CSVToDataset;//将文本导入到数据集的方法
procedure DatasetToCSV;//将数据集的数据导入到文本的方法
end;
procedure Register;
{略}
implementation
{略}
end.
从声明部分中我们可以看到,TPgCSV将文本数据的导入导出全部封装到了CSVToDataSet(文本数据导入)和DataSetToCSV(文本数据导出)两个方法中.开发者可以在设计阶段直接将文本文件同要导入/出的数据库相连,然后在程序运行当中调用这两个方法就可以了,根本不用理会那些函数什么的,相当的方便.
那我是不是可以直接拿来使用呢?这里就出现问题了.
----问题一及解决方案
在该控件自带的Demo中,所使用的文本数据文件,格式如下
test.csv
"11","12","13","14"
"21","22","23","24"
"31","32","33","34"
...
而ISO文件中的数据格式(部分)为
sm01632.ISO
... a7507310175b特精装d¥1893"‑1 a毛泽东珍品典藏(上、下册)f中共中央文献研究室编著‑c中献d011200"...
...a7119029193b平装 d¥20"‑1 a中国:加入WTO与经济改革f王 梦 奎编著‑ c外文d011200"‑ ...
我们看到,同test.csv相比,sm01632.ISO文件中的纪录很不规则。
我们所需要的是这样的纪录
sm01632.ISO
... 7507310175,特精装,1893,1,毛泽东珍品典藏(上、下册),中共中央文献研究室编著,中献,011200...
...7119029193,平装,20,1,中国:加入WTO与经济改革,王 梦 奎编著,外文,011200‑ ...
TPgCSV能否对这种情况进行自动的处理呢?哇噻,这种万能的控件好像不大可能有吧!(事实上也不需要)既然直接用TPgCSV处理无法实现正确导入的,我们就需要在每一条从文件中读取出来的纪录导入数据库之前,用程序对它们进行处理,转换之后再交由TPgCSV进行操作。怎么样处理这里就不赘述了。我们所关心的是TPgCSV有没有开放出这样一个处理的接口呢?
我们来看DataSetToCSV方法的实现代码(主要是注释部分):
procedure TPgCSV.CSVToDataSet;
var
RecordString,
Temp : string;
i : Integer;
C : LongInt;
D : Boolean;
F : Real;
ErrorResponse : TPgCSVErrorResponse;
Buffer : Pointer;
begin
//create field cache
FFieldCache:=TList.Create;
//initiate map items
FMapItems:=0;
//allocate buffer size
GetMem(Buffer,FBufferSize);
//assign and open CSV file
AssignFile(FFile,FCSVFile);
SetTextBuf(FFile,Buffer^,FBufferSize);
Reset(FFile);
//open table if nessecary
if FAutoOpen then
begin
if Assigned(FBeforeOpenTable) then
FBeforeOpenTable(Self);
FDataset.Open;
if Assigned(FAfterOpenTable) then
FAfterOpenTable(Self);
end;
//export to table from CSV file
if Assigned(FBefore 上一页 [1] [2] [3] 下一页 |