【问题标题】:access: read CSV file into table访问:将 CSV 文件读入表中
【发布时间】:2010-06-06 23:46:02
【问题描述】:

是否可以以编程方式访问打开某个 csv 文件并将其读入数据表并设置诸如什么时间的分隔符、TEXT QUALIFIER 等参数,包括手动将 csv 文件导入表所需的所有步骤?

【问题讨论】:

    标签: vba ms-access


    【解决方案1】:

    您可以创建一个Scripting.FileSystemObject,然后逐行在文件中流式传输,通过分隔符分隔字段,并将每个已解析的记录添加到基础记录集或另一个表中。

    您也可以尝试使用DoCmd.TransferText,因为这似乎是最有前途的内置方法。

    编辑:对于更完整(并且复杂且效率可能较低)的解决方案,它可以让您更好地控制模式并将任何 csv 文件视为任何其他数据源,请查看 ODBC:Microsoft Text Driver - http://support.microsoft.com/kb/187670 for脚本示例。我相信您已经可以通过标准的 MS Access 前端 link 访问任何 cvs 文件,从而允许您对其进行任何表读取/复制操作。否则,只需设置一个 ODBC 文件 dns 条目以插入您的 csv 文件(通过 Start->Program Files->Administrative Tools->Data Sources),然后您可以通过 Access 文件选择/链接到它。

    【讨论】:

    • 肯定 TransferText 是这里的明显赢家?
    【解决方案2】:

    这在很大程度上取决于 Access 表是否已经创建,或者您是否要即时创建它。让我们假设(为了简单起见)该表已经存在(您可以随时返回并创建该表)。正如在您需要一些脚本工具之前所建议的那样:

    Dim FSO As FileSystemObject, Fo As TextStream, line As String
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set Fo = FSO.OpenTextFile("csvfile.csv")
    

    这将允许您读取作为文本文件的 csv 文件。您可以在此处控制您使用的分隔符以及将采用哪种日期格式等。您还需要使用数据库引擎:

    Dim db As Database
    Set db = DBEngine.OpenDatabase("mydatabase.accdb")
    

    这基本上就是您所需要的。您逐行阅读您的 csv 文件:

    While Not Fo.AtEndOfStream
     line = Fo.ReadLine
    

    现在您需要能够为表格充分格式化每个字段,这意味着:文本字段必须用引号 (") 括起来,日期字段必须用 # 等括起来。 否则数据库引擎会大声抱怨。但同样,你在这里负责,你可以对你的输入行做任何你需要的整容手术。我做的另一个假设(为了简单起见)是你很擅长用 VBA 编程。 那么让我们来看看问题的症结所在:

     db.Execute ("INSERT INTO myTable VALUES (" & line & ")")
    Wend
    

    此时,line 已更改为数据库引擎可食用的内容,例如,如果原始读取行是

    33,04/27/2019,1,1,0,9,23.1,10,72.3,77,85,96,95,98,10,5.4,5.5,5.1,Cashew,0
    

    你改成

    33,#04/27/2019#,1,1,0,9,23.1,10,72.3,77,85,96,95,98,10,5.4,5.5,5.1,"Cashew",0
    

    最后一点: csv 文件的每个字段都必须与表格中的字段匹配,这一点很重要。这至少包括,但不一定是最后,按正确的顺序排列。您必须确保在您的预处理阶段。希望这会让你走上正轨。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-11
      • 2016-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多