【问题标题】:faster tab delimited import of large file access vba更快的制表符分隔导入大文件访问vba
【发布时间】:2018-01-31 08:54:15
【问题描述】:

我有一个 176mb 的 .tab 文件,其中包含 780k 条记录,我必须每天将其加载到 Access 并删除旧数据。我也希望 ImportDate 在同一个表中。

我尝试了不同的导入方法,但速度真的很慢。使用 DAO 大约需要 14 分钟来导入和插入日期。我尝试使用 DoCmd,但它的速度同样慢,甚至更多。我无法删除该表,但需要将其插入,因为 access 没有准确地设置字段的属性。我还发现每次都需要压缩数据库,否则它会变大。

如何才能更快地导入文件?手动操作不会花那么长时间。

这是我尝试过的:

compactfile = accdbfilepath
srcfile = "filepath\filename2017_be.accdb"
moaqdate = "8/22/2017"

Set fso = CreateObject("Scripting.FileSystemObject")
fso.CopyFile srcfile, compactfile
Set db = OpenDatabase(compactfile)
db.Execute "DELETE * FROM [MOAQ]"
db.Execute ("insert INTO [MOAQ] select * FROM 
[Text;HDR=YES,FMT=TabDelimited;Database=" & accesspath & "].[" & 
filenametotab & "]"), dbFailOnError
db.Execute "update [MOAQ] set importdate =(""" & moaqdate & """)"
db.Close

destinationfile = "filepath\filename2017_be.accdb"
Application.CompactRepair compactfile, destinationfile


fso.CopyFile destinationfile, srcfile
Kill destinationfile
Set fso = Nothing

【问题讨论】:

  • 我想说,除非您打算考虑切换到 SQL Server 或 SQL Server Express,否则除了在等待时喝杯咖啡之外,您可能别无选择。如果您使用的是 SQL Server,则可以使用非常快的 Bulk Insert。
  • 您还尝试了哪些其他方法?有DoCmd.TransferSpreadsheetDoCmd.RunSavedImportExport,后者应该相当于手动导入。

标签: vba csv ms-access import


【解决方案1】:

我会这样做:

compactfile = accdbfilepath
srcfile = "filepath\empty_MOAQ_table_only_be.accdb"
destinationfile = "filepath\MOAQ_table_be.accdb"
moaqdate = "8/22/2017"

Set FSO = CreateObject("Scripting.FileSystemObject")
FSO.CopyFile srcfile, destinationfile, True
Set db = OpenDatabase(destinationfile)
db.Execute ("insert INTO [MOAQ] select #" & moaqdate & "# as importdate, * " & _
    "FROM [Text;HDR=YES,FMT=TabDelimited;Database=" & accesspath & "].[" & filenametotab & "]"), dbFailOnError
db.Close
Set FSO = Nothing

在这种情况下,您将不需要复制带有数据的文件两次、删除数据、压缩和修复以及更新日期。

将您的大表分离到仅包含一个表的专用后端,使用空表创建此文件的副本 (empty_MOAQ_table_only_be.accdb) 并将其复制到现有的专用后端,而不是重复处理大文件、删除和 c&r。

您可以与文件数据同时插入更新日期,无需更新。

它应该工作得更快。

【讨论】:

  • 我试过这段代码,但我收到错误 128,vba 只是跳过了导入行
  • compactfile = "filepath\Backend\MOAQ2017_be.accdb" moaqdate = "8/22/2017" On Error Resume Next '删除旧标签文件 accesspath = "filepath\Backend\" filenametotab = "MOAQ_2017_REPORT_20170725. txt" Strfilename = accesspath & filenametotab Set db = OpenDatabase(compactfile) db.Execute "DELETE * FROM [MOAQ]" db.Execute ("insert INTO [MOAQ] select #" & moaqdate & "# as importdate, * " & _ "FROM [Text;HDR=YES,FMT=TabDelimited;Database=" & accesspath & "].[" & filenametotab & "]"), dbFailOnError db.Close
  • 删除On Error Resume Next,提供错误全文。看起来文本文件的列名无效。 SQL 文本也可能存在问题。使用 Debug.Pring 将 SQL 文本转储到即时窗口并尝试“运行”它的查询生成器
猜你喜欢
  • 2019-03-04
  • 2013-05-22
  • 2013-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
相关资源
最近更新 更多