ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 15503|回复: 7

[分享] 如何用ADO提取CSV文件数据

[复制链接]

TA的精华主题

TA的得分主题

发表于 2008-11-22 07:55 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
偶得e文,是关于ado提取csv文件数据的,现粗略翻译如下:

csv文件和xml文件一样是存储数据的简单方法。很多时候,我们要从CSV文件中提取某些数据,就可以使用ADO SQL语句。
与用ADO连接ACCESS主要的不同是连接字符,如下所示:
Source=c: \temp\;Extended Properties=""text; HDR=Yes; FMT=Delimited (,)""
Source : CSV文件保存的文件夹
Extended Properties: Text (表示文本文件), HDR =Yes (如果文本文件中首行是字段名称),
FMT=Delimited(,) (表示是以逗号分割的文件)
其次不同是sql语句:
sQuery = "Select * From VBA.csv ORDER BY ID"
我们在连接字符里只指定了文件路径。这里我们指定文件名称即(vba.csv 文件的名称为vba)
下面的代码需要引用Microsoft ActiveX Data Objects library

Sub Sort_CSV()

        Dim cN As ADODB.Connection         '* Connection String
        Dim RS As ADODB.Recordset         '* Record Set
        Dim sQuery As String                         '* Query String

        On Error GoTo ADO_ERROR
        cN = New ADODB.Connection
        cN.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\temp\;Extended Properties=""text;HDR=Yes;FMT=Delimited(,)"";Persist Security Info=False"

        cN.ConnectionTimeout = 40
        cN.Open()
        RS = New ADODB.Recordset
        sQuery = "Select * From VBA.csv ORDER BY ID"
        RS.ActiveConnection = cN
        RS.Source = sQuery
        RS.Open()

        If RS.EOF <> True Then
                While RS.EOF = False
                Open "c:\temp\vba_sorted.csv" For Append As 1
                Print #1, RS.Fields(0) & "," & RS.Fields(1)
                        RS.MoveNext()
                Close #1
                End While
        End If

        If RS.State <> adStateClosed Then
                RS.Close()
        End If

        If Not RS Is Nothing Then RS = Nothing
        If Not cN Is Nothing Then cN = Nothing

ADO_ERROR:
        If Err <> 0 Then
                Debug.Assert(Err = 0)
                MsgBox(Err.Description)
                Resume Next
        End If
End Sub

对csv文件进行排序操作不太容易。一种方法是在EXCEL中打开文件,操作后保存。尽管如此,一旦行数超过EXCEL可以容纳的数量,你就可能要使用ADO对文件操作,然后回存为CSV文件。

[ 本帖最后由 minjiwei 于 2008-11-22 08:02 编辑 ]

TA的精华主题

TA的得分主题

发表于 2008-11-22 09:06 | 显示全部楼层
直接用二进制打开操作不更好?请参考以下代码,适合打开CSV和TXT格式
    f = Application.GetOpenFilename
    Dim LFile As Long, DAT() As Byte, ST As String, aa As String
    LFile = FileLen(f) - 1
    ReDim DAT(LFile) As Byte
    Open f For Binary As #1
    Get #1, , DAT
    Close #1
    ST = DAT
    If DAT(0) = &HFF And DAT(1) = &HFE Then    '如果是Unicode编码文件
        ST = Mid(ST, 2)
    Else
        ST = StrConv(ST, vbUnicode)
    End If
    If UBound(Split(ST, Chr(13) & Chr(10))) > 0 Then
        arr = Split(ST, Chr(13) & Chr(10))
    Else
        arr = Split(ST, Chr(10))
    End If
    ReDim arr1(0 To UBound(arr), 0 To UBound(Split(arr(i), ",")))    '转换二维数组
    If UBound(arr) > 0 Then
        For i = 0 To UBound(arr)
            For j = 0 To UBound(Split(arr(i), ","))
                    If i <= UBound(arr1) And j <= UBound(arr1, 2) Then arr1(i, j) = Split(arr(i), ",")(j)
            Next j
        Next i
    End If

[ 本帖最后由 彭希仁 于 2008-11-22 09:15 编辑 ]

TA的精华主题

TA的得分主题

发表于 2014-3-6 19:14 | 显示全部楼层
为何现在ADO CVS的说明好少...网路上找超久才找到这个。

连里面的写法都是古老的写法end while ....,觉得快没人用了

另外,可以排序能有什么困难的...
發个“现代一点”的代码...
  1. Public Sub SelectCSV(CSVPath As String, sQuery As String, ExportFn As String)

  2.         Dim cN As ADODB.Connection         '* Connection String
  3.         Dim RS As ADODB.Recordset         '* Record Set
  4.         'Dim sQuery As String                         '* Query String

  5.         'On Error GoTo ADO_ERROR
  6.         Set cN = New ADODB.Connection
  7.             cN.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & CSVPath & ";Extended Properties=""text;HDR=Yes;FMT=Delimited(,)"";Persist Security Info=False"

  8.             cN.ConnectionTimeout = 40
  9.             cN.Open
  10.         Set RS = New ADODB.Recordset
  11.         'sQuery = "Select * From VBA.csv ORDER BY ID"
  12.             RS.ActiveConnection = cN
  13.             RS.Source = sQuery
  14.             RS.Open

  15.         If RS.EOF <> True Then
  16.             Dim Str As String
  17.             Dim i As Integer
  18.             Open ExportFn For Output As 1
  19.             
  20.                 For i = 0 To RS.fields.Count - 1
  21.                     Str = Str & RS.fields(i).Name & ","
  22.                 Next
  23.                
  24.                 Str = Left(Str, Len(Str) - 1)
  25.                 Print #1, Str
  26.                
  27.                 While RS.EOF = False
  28.                     Str = ""
  29.                     For i = 0 To RS.fields.Count - 1
  30.                         Str = Str & RS.fields(i) & ","
  31.                     Next
  32.                     Str = Left(Str, Len(Str) - 1)
  33.                     
  34.                     Print #1, Str
  35.                     
  36.                     RS.MoveNext
  37.                
  38.                 Wend
  39.             Close #1
  40.         End If

  41.         If RS.State <> adStateClosed Then
  42.                 RS.Close
  43.         End If

  44.         If Not RS Is Nothing Then
  45.             Set RS = Nothing
  46.         End If
  47.         
  48.         If Not cN Is Nothing Then
  49.             Set cN = Nothing
  50.         End If

  51. ADO_ERROR:
  52.         If Err <> 0 Then
  53.                 Debug.Assert (Err = 0)
  54.                 MsgBox (Err.Description)
  55.                 Resume Next
  56.         End If
  57. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2014-12-19 20:53 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
彭希仁 发表于 2008-11-22 09:06
直接用二进制打开操作不更好?请参考以下代码,适合打开CSV和TXT格式
    f = Application.GetOpenFilename
...

打开文件是很简单,方法也很多,但重点是可以用SQL语句筛选得到你想要的、帮你排序、汇总,省了后续的麻烦。

TA的精华主题

TA的得分主题

发表于 2014-12-19 21:41 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2015-11-5 15:22 | 显示全部楼层
请教老师,CSV文件的标志是逗号(,),那么ADO如何操作以“;”或是“|”作分隔符的文本文件呢?

TA的精华主题

TA的得分主题

发表于 2019-1-30 20:48 | 显示全部楼层
下面的代码需要引用Microsoft ActiveX Data Objects library,是哪个版本的啊?

6.1,2.0,2.1.......有很多啊?

TA的精华主题

TA的得分主题

发表于 2020-4-28 20:58 | 显示全部楼层
csv个人观点如果自定义格式需要用stream,如果是用单一的符号分隔就ado还算比较方便,毕竟一句话直接汇总,不用另外循环和考虑程序结构
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-22 20:46 , Processed in 0.043207 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表