使用 ADO 导入 CSV 文件

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

这次下载的库存数据是 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;

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值