设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
楼主: 123shusheng
打印 上一主题 下一主题

[表] 再谈批量导入CSV文件

[复制链接]
11#
 楼主| 发表于 2013-4-11 23:06:32 | 只看该作者
本帖最后由 123shusheng 于 2013-4-11 23:08 编辑

您的例子经过测试,我的两个表1个是10列,一个是13列,我将模块内n=13,提示运行时错误“3265”,在对应所需名称或序数的集合中,未找到项目。
另外,实现一个按钮,一张表导入后,能否默认将文件夹内所有CSV文件全部导入,不用的文件我人工消除,谢谢!
  If InStr(1, strFileName, "n") > 0 Then
     n = 13
   Else
     n = 13
   End If
   Set connA = CurrentProject.Connection
    conn.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};" & _
              "DBQ=" & strFilePath & ";Extensions=asc,csv,tab,txtersist Security Info=False"   '打开数据链接关键
    With rs
        .CursorType = 2
        .LockType = 3
        .CursorLocation = 3
        .ActiveConnection = connA
    End With

    sqlcsv = "SELECT * FROM [TEXT;FMT=CSV;DELIMITED;HDR=YES;DATABASE=" & strFilePath & "].[" & strFileName & "]"
    Debug.Print sqlcsv
    rs.Open sqlcsv, connA
    rs.Move (0)         '移动到指定记录
    sql = "Select * From tbl_Export"
    rs1.Open sql, connA, 1, 3
    Do Until rs.EOF
        rs1.AddNew
        For i = 0 To n
            rs1.Fields(i + 0) = rs.Fields(i)
            'rs1(i + 1) = rs(i)
        Next
        rs.MoveNext
    Loop
    rs1.UpdateBatch
    rs1.Close
    rs.Close
    conn.Close
    Set rs = Nothing
    Set rs1 = Nothing
    Set conn = Nothing
End Function
12#
发表于 2013-4-12 10:40:38 | 只看该作者
本帖最后由 aslxt 于 2013-4-12 11:02 编辑

If InStr(1, strFileName, "n") > 0 Then
     n = 13
   Else
     n = 13
   End If

第一个"n" 是判断表名称是否带有【n】这个字符,根据不同的情况处理第二个n的值:
If InStr(1, strFileName, "n") > 0 Then   '判断表名称是否带有【n】这个字符
     n = 13   '如果表名称是带有【n】这个字符,那么这个表的列数是多少,就填比列数少1的数:例如有13列,就“n=12”
   Else
     n = 13 '如果表名称不是带有【n】这个字符,那么这个表的列数是多少,就填比列数少1的数:例如有10列,就“n=9”
   End If

主要是按照你给的实例来搞的,实际情况变更后,你要修改。当然,access表也要增加同样的字段
13#
发表于 2013-4-12 11:05:20 | 只看该作者
“另外,实现一个按钮,一张表导入后,能否默认将文件夹内所有CSV文件全部导入,不用的文件我人工消除...”
意思是未导入文件夹下的所有文件均默认全部导入,然后你再在access的表中人工消除已导入的并且确认不要的数据?
14#
 楼主| 发表于 2013-4-12 15:45:18 | 只看该作者
本帖最后由 123shusheng 于 2013-4-12 15:49 编辑
aslxt 发表于 2013-4-12 10:40
If InStr(1, strFileName, "n") > 0 Then
     n = 13
   Else


感谢您的回复,太详细了,每条语句都有解释,收益匪浅,再次向您表示感谢!
按照您的指点,我的数据库也改好了,非常满意!
我默认是导入待导入数据文件夹里的所有CSV文件,现在需要在CSV窗体List1列表框内一个一个的选择文件,因为文件数量比较多,所以有点麻烦。但我发现其实按Shift键同时点击List1列表框内的最后一个文件,也可以做到全选,但是还是存在人差错,造成有文件没有导入,所以有点美中不足。
所以我想能否CSV窗体中List1列表框内默认是全部选中状态,有个别不需要的文件我在List1列表框内点击它,可以成为不选中状态(同List1列表框目前状态正好相反),然后点击导入按钮,导入我需要导入的CSV文件。
15#
发表于 2013-4-12 19:57:52 | 只看该作者
Sub ShowFolderList(strFolderPath As String)    '向待导入数据列表矿添加数据的过程

    Dim i As Long
    Dim fso As Object
    Dim objFolder As Object
    Dim objFile As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set objFolder = fso.GetFolder(strFolderPath)

    Me.List1.RowSource = ""
    For Each objFile In objFolder.Files
        Me.List1.AddItem (objFile.Name)
    Next
    '**********添加以下三行
    For i = 0 To List1.ListCount
      List1.Selected(i) = True
    Next i
    '***************
    Set objFile = Nothing
    Set objFolder = Nothing
    Set fso = Nothing

End Sub
16#
 楼主| 发表于 2013-4-12 22:27:23 | 只看该作者
太棒了,测试成功。我的问题在高手眼里,简直是张飞吃豆芽——小菜一碟。谢谢!
我在使用中还有一个问题,例子中的待导入数据和已导入数据两个文件夹,默认是在程序所在的文件夹内,实际使用不太方便,如何指定位置;如:  d:\程序\待导入数据; d:\程序\已导入数据
17#
发表于 2013-4-13 10:50:04 | 只看该作者
请教aslxt,如果批量导入EXCEL,如何写代码?
18#
 楼主| 发表于 2013-4-13 22:23:21 | 只看该作者
aslxt 老兄的帮助下,我的窗体功能不断完善,非常感谢论坛里各位版主的大力帮助,你们的无私帮助,是我们后来者前进的动力。
我今天测试还有一个问题。因为我每天都会有一批CSV表。我每天把需要导入的表存放在待导入数据文件夹,同时导入数据文件夹中将导入数据文件夹中,将需要导入的表的前一天的CSV表从已移动到待导入数据文件夹,然后将这两日的文件同时导入数据库进行分析。
目前我在窗体中设了一个按钮,可以根据我今天要导入的表,自动将导入数据文件夹中符合要求的文件移动到待导入数据文件夹,可是窗体中List1文本框内文件数不能刷新,不能显示新移动来的文件。必须关闭窗体,然后再打开窗体,才能显示全部文件。请问怎么才能将List1文本框内文件数刷新一下,谢谢!
19#
 楼主| 发表于 2013-5-2 17:08:01 | 只看该作者
自己顶一下,希望能得到高手的帮助
20#
发表于 2013-5-9 08:11:31 | 只看该作者
看了这个例子 得到很多启发 谢谢了 但是有个疑问 如果需要导入的数据改成“01.002.01h
”为什么导入后变成了“3.001” 有人能帮我解答一下吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-16 22:46 , Processed in 0.103200 second(s), 32 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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