Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

关于.csv文本文件导入问题续集

baiqingrui  发表于:2014-08-08 20:15:17  
复制

前段时间问了一个关于.csv文件导入的问题 http://www.accessoft.com/bbs/showtopic.asp?Id=21990 因为原文件字段间是用逗号分隔的, 但如果字段值里包含","的话, 导入时会出错.

这两天倒腾数据又有一个新的发现.

我的原始数据如下:

 

前两个姓名里面有"," 如果直接导入ACCESS会出错, 类似这样:



需要在使用ACCESS导入文本文件时, 在下面这个步骤中勾选文本识别符, 在下拉框中选"  ,然后导入就成功了



我不懂vba, 我想请教的问题是: 如何用vba代码实现将.csv的文件导入ACCESS, 并将文本识别符设置为" (双引号). 麻烦不吝赐教,谢谢!

 

Top
金宇 发表于:2014-08-09 10:28:51

用vba代码导入的话有两种方式,我做了个示例,你下载看看。

点击下载此附件



baiqingrui 发表于:2014-08-11 19:15:28

谢谢金宇, 可以导入. 但是还存在两个问题, 一是需要先建好一张空表,准备导入数据; 二是代码中列举了所有字段, 但是字段很多的话就不行了. 不知道是否能解决. 我把金宇的代码贴一下,大家可以看看.

方法一:

Private Sub btnIn_Click()
Dim conn As Object
Dim rst  As Object
Dim rst1 As Object
Dim strSQL As String
Set conn = CreateObject("adodb.connection")
conn.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};" & _
              "DBQ=" & CurrentProject.Path & ";Extensions=asc,csv,tab,txt;Persist Security Info=False" '打开数据链接


strSQL = "select * from [测试表.csv]"
Set rst = conn.Execute(strSQL)


Set rst1 = CurrentDb.OpenRecordset("测试表", dbOpenDynaset, dbAppendOnly)
Do While Not rst.EOF
    rst1.AddNew
    rst1("编号") = rst("编号")
    rst1("姓名") = rst("姓名")
    rst1("性别") = rst("性别")
    rst1("年龄") = rst("年龄")
    rst1.Update
rst.MoveNext
Loop
rst.Close
rst1.Close
MsgBox "导入成功!"
DoCmd.OpenTable "测试表"
End Sub

方法二:
Private Sub btnIn2_Click()
    Dim strSQL As String
    strSQL = "Insert INTO 测试表(编号,姓名,性别,年龄) Select 编号,姓名,性别,年龄 FROM [TEXT;FMT=CSV;DELIMITED;HDR=YES;DATABASE=" & CurrentProject.Path & "].[测试表.csv];"
    DoCmd.RunSQL strSQL
    DoCmd.OpenTable "测试表"
End Sub





金宇 发表于:2014-08-13 12:39:21

我是因为要需要测试示例所以才需要预先建一张空表,如果你有需要导入的Access表,那么在代码中指定需要导入的表就行,

Set rst1 = CurrentDb.OpenRecordset("测试表", dbOpenDynaset, dbAppendOnly) 这行代码中的“测试表”改为你需要实际导入的Access表名称就行。


我做了个示例只是起到参考引导作用的,因为我并不清楚你具体有多少个字段及其它情况,你要根据你具体的实际情况对示例代码进行调整以适应你的需求,需要增加字段的话你可以参考我的代码往下增加就行了。

    rst1("编号") = rst("编号")
    rst1("姓名") = rst("姓名")
    rst1("性别") = rst("性别")
    rst1("年龄") = rst("年龄")

下面可以不断增加字段保存代码的,例如
    rst1("字段5") = rst("名称5")

    rst1("字段6") = rst("名称6")

...........



baiqingrui 发表于:2014-08-13 15:01:29
我本来的想法是,能不能写一段代码,作用相当于ACCESS的“导入文本向导”,把向导里需要选择的几个参数都在vba代码中设置好。然后导入的时候只需要点击导入按钮,弹出来资源管理器窗口,去找到想要导入的文本格式数据,选中后确定就直接导入到ACCESS。我不知道这个设想是否能实现。

金宇 发表于:2014-08-14 10:00:32

使用上面两种导入方法后不需要再去设置字段分隔符和文本识别符,弹出资源管理器窗口选择要导入的csv文件是可以的。

将上面方法一的代码修改为如下就行

Dim conn As Object
Dim rst  As Object
Dim rst1 As Object
Dim strSQL As String
Dim strSelectFile As String
Dim strPath       As String
Dim strFileName   As String
With Application.FileDialog(3)
    .AllowMultiSelect = False
    .InitialFileName = ""
    .Filters.Clear
    .Filters.Add "CSV文件", "*.CSV"
    If .Show = -1 Then
        strSelectFile = .SelectedItems.Item(1)
    Else
        Exit Sub
    End If
End With
strPath = Left(strSelectFile, InStrRev(strSelectFile, "\"))
strFileName = Mid(strSelectFile, InStrRev(strSelectFile, "\") + 1)

Set conn = CreateObject("adodb.connection")
conn.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};" & _
              "DBQ=" & strPath & ";Extensions=asc,csv,tab,txt;Persist Security Info=False" '打开数据链接


strSQL = "select * from [" & strFileName & "]"
Set rst = conn.Execute(strSQL)


Set rst1 = CurrentDb.OpenRecordset("测试表", dbOpenDynaset, dbAppendOnly)
Do While Not rst.EOF
    rst1.AddNew
    rst1("编号") = rst("编号")
    rst1("姓名") = rst("姓名")
    rst1("性别") = rst("性别")
    rst1("年龄") = rst("年龄")
    rst1.Update
rst.MoveNext
Loop
rst.Close
rst1.Close
MsgBox "导入成功!"
DoCmd.OpenTable "测试表"



baiqingrui 发表于:2014-08-15 20:20:43
金宇, 万分感谢!

总记录:6篇  页次:1/1 9 1 :