这次下载的库存数据是 CSV 文件。
这个文件的格式是:
1. 以逗号分隔;
2. 分隔的除了逗号,还在两头加上了双引号。因此,在两个双引号中间的内容是可以包含逗号的,因为在两个双引号中间,这样的逗号不应该被解释为分隔符。
在 Delphi 底下:
1. Ehlib 也可以导入 CSV 但是对格式的兼容比 FireDAC 更差;
2. FireDAC 的 DataMove 支持从 csv 读入并写入 DataSet; 但是,对于特定的 csv 文件(内容里面有逗号)识别不好会出错,可能(而不是必然)会将两个双引号中间的逗号解析为分隔符导致对位错误引发失败。但有一些 csv 文件里面同样在两个双引号中间的内容里面有逗号,却又能正确解析。因此,不稳定。
3. 对于 FireDAC 导入会出错的文件,直接使用 ADO 控件,没有问题。
------------------------------
使用 ADO 的方法:
1. 拖一个 ADOConnection1 到界面上;
2. 拖一个 ADOTable1 到界面上,设置其 Connection 为上述 ADOConnection1
3. 设置 ADOConnection1 的连接字符串为:
Provider=MSDASQL.1;Persist Security Info=False;Extended Properties="DefaultDir=D:\MY_DOC;Driver={Microsoft Text Driver (*.txt; *.csv)};DriverId=27;FIL=text;FILEDSN=D:\My_DOC\aaa.dsn;MaxBufferSize=2048;MaxScanRows=8;PageTimeout=5;SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;"
上述连接字符串里面,有 DefaultDir 的设置,其内容为有 csv 文件的文件夹。这里的例子是 D:\My_DOC
设置好连接字符串以后,直接点击 ADOConnection1 的 Connected 属性,修改为 True,如果成功,则说明连接字符串正确。设置为 True 以后,其 DefaultDataBase 属性显示为上述连接字符串里面的文件夹,例子这里就是:D:\My_DOC;
要注意上述连接字符串里面的 FILEDSN=D:\My_DOC\aaa.dsn 这个是我在创建连接字符串的时候创建的 dsn 文件,是 ADO 在创建连接字符串的时候必须要的。这个 DSN 文件的内容如下:
[ODBC]
DRIVER=Microsoft Text Driver (*.txt; *.csv)
UID=admin
UserCommitSync=Yes
Threads=3
SafeTransactions=0
PageTimeout=5
MaxScanRows=8
MaxBufferSize=2048
FIL=text
DriverId=27
DefaultDir=D:\My_DOC\
然后,到 ADOTable1 的 TableName 属性那里去下拉,就会把上述文件夹底下的 txt, csv 文件的名字都显示出来。选择正确的 csv 文件,点击 ADOTable1 的 Active 属性设置为 True,如果成功,则说明使用 ADO 打开这个 CSV 文件成功。
更进一步的测试:
1. 连接字符串里面的 DefaultDir 部分去掉不要,不影响程序运行;
2. 连接字符串里面的 FILEDSN=D:\My_DOC\aaa.dsn 去掉不要,不影响程序运行。也就是说这个 aaa.dsn 文件不是必须的。但在创建连接字符串的时候,一定要创建一个 dsn 文件才能通过。
最终测试通过的代码如下:
procedure TForm1.Button6Click(Sender: TObject);
begin
// 使用相同的连接字符串,并且连接字符串中间去掉了 DefaultDataBase ,可以随便选择不同目录的文件来作为表的名字打开。
//这里,ADOConnection 的数据库指的是某个目录;ADOTable1 的 TableName 是指的某个 CSV 文件的文件名,可以包含全路径名。
//看起来,连接字符串里面的 FILEDSN=D:\My_DOC\aaa.dsn 似乎也没有用。因为我把实际文件名改为了 aaaa.dsn 因此这里描述的 aaa.dsn 不存在了,也不影响程序运行。
//实际测试,从连接字符串里面把 aaa.dsn 去掉,确实不影响程序运行。
ADOTable1.Active := False;
ADOConnection1.Connected := False;
ADOConnection1.DefaultDatabase := '';
ADOConnection1.ConnectionString := Memo1.Lines.Text;
ADOConnection1.Connected := True;
if OpenDialog1.Execute then
begin
//ADOConnection1.DefaultDatabase := ExtractFilePath(OpenDialog1.FileName); //无需设置 DefaultDataBase 属性。设置了反倒不对。
ADOTable1.TableName := OpenDialog1.FileName; // ExtractFileName(OpenDialog1.FileName);
ADOTable1.Open;
end;
ShowMessage('记录条数:' + ADOTable1.RecordCount.ToString);
end;

本文介绍了在Delphi环境下处理CSV文件的三种方法:Ehlib、FireDAC和ADO。针对含有逗号的复杂CSV文件,Ehlib的兼容性较差,而FireDAC可能出现解析错误。相比之下,使用ADO控件能够稳定地读取这类文件。通过设置ADOConnection的ConnectionString,可以指定文件夹并导入CSV。即使不包括DefaultDir和FILEDSN,代码仍能正常工作。最终,提供了一段通过OpenDialog选择CSV文件并加载到ADOTable的示例代码。
7041

被折叠的 条评论
为什么被折叠?



