【问题标题】:SELECT * INTO Access FROM csv ; running VBA ADO from Excel从 csv 中选择 * 进入访问;从 Excel 运行 VBA ADO
【发布时间】:2022-08-14 17:55:47
【问题描述】:

upd.:这是最终解决问题的语法: \'createSQL = \"SELECT * INTO newlyСreatedTableName FROM [fileName.csv] IN \'folderPath\' [\"\"Text;HDR=YES;FMT=Delimited\"\"]\"

数据传输困难重重。我有一个包含 600 万行的 .csv,并尝试将其导入 Excel 中的 Access DB 运行代码。我有一个简单的代码。

Function getAccCN(ByVal dbFullPath As String) As Object
    Set getAccCN = CreateObject(\"ADODB.Connection\")
    getAccCN.connectionString=\"Provider=Microsoft.ACE.OLEDB.16.0;Data Source=\" & dbFullPath
End Function

Function createSQL() As String
    createSQL = \"Select * INTO [\" & _ 
                fileName & \"] FROM [Data source = \" & _
                repFile.ParentFolder.Path & _ 
                \"\\; Extended Properties=\"\"Text;HDR=Yes;FMT=Delimited\"\"].\" & _ 
                repFile.Name \' repFile is a *.csv as \"Scripting.FileSystemObject\"

    Debug.Print createSQL \' returns following:
     \' Select * INTO [Classification] FROM [Data source = \\\\av-fs01.av.local\\profiles$\\...\\Project IQVIA\\; Extended Properties=\"Text;HDR=Yes;FMT=Delimited\"].Classification.csv
     \' *.accdb and the table name and  *.csv have the same base name - \"Classification\"
End Function

Function uploadCSV() as Boolean
Dim CN as Object
    Set CN = getAccCN(repFile.ParentFolder.Path & \"\\\" & baseFileName & \".accdb\")
    CN.Open
    CN.Execute createSQL() \' this creates Error
    Exit Function
ErrHandler:
    Debug.Print Err.Number \' = -2147467259  \"Wrong argument.\"
       \'CN.ERROR - Arguments are of the wrong type, out of range, or conflict with each other.
End Function

源的标题和第一行。

所以,我不知道如何解决这个问题。我会非常感谢任何帮助。

  • 600 万个 CSV 文件的大小是多少?超过 2GB(msAccess 表限制)?
  • @ALeXceL 它是 0.5 GB
  • FMT=Delimited(,)?
  • @BZngr FMT=Delimited(,) 返回相同的错误。 1 行 .csv 我添加了源数据的截图
  • @ALeXceL,我已经在 Access 2GB 限制下构建了 9+ 百万行的 Access 表,接近 1GB。在三列中,OP 可以处理此操作。如果 OP 使用带有代码描述的查找表来仅用于两列表的类代码并避免重复文本,那就更好了。

标签: sql excel vba ms-access ado


【解决方案1】:

由于问题是一次要导入的行数,我建议使用 Power Query 导入并在其中执行所需的工作(Power Query 就是为此而设计的)。之后,将这 600 万行分成 6 个查询,每个查询都可以导入 Excel 或作为导出到另一个应用程序的基础。我在这里做了一个测试,它成功了:我创建了一个包含 6M 行的 CSV 文件,其中包含文本“这是一个 6M 行文件,这是行 (lngPtr)”。导入 Power Query 后,我将单列拆分为 4 个其他列,最后应用 Table.Split,根据下面的 M 脚本将表分成 6 个(每个 1M 行)(要修改的示例):

let
    Font = Csv.Document(File.Contents("C:\temp\6MRows.CSV"),[Delimiter=",", Columns=1, Encoding=1252]),
    #"Split Table" =Table.Split(Font,1000000)
in
    #"Split Table"

拆分CSV文件后,PQ中会出现6个“表格”。然后将它们添加到 6 个新查询中。不到 20 分钟,CSV 就进入了 PQ(Excel365、Win10Pro、I7/16Gb)

【讨论】:

  • 谢谢你的回答。这是个好主意。你能补充一下如何将PQ表导入SQL Server,我没有经历过),可能是几句话。
  • 我也没有,对不起。但是由于这 6 个中的每一个都可以加载到电子表格中,因此您可以从那里将它们加载到 SQLServer 中。
【解决方案2】:

请试试这个和反馈。

Sub csv_Import()
Dim wsheet As Worksheet, file_mrf As String
Set wsheet = ActiveWorkbook.Sheets("Single")
file_mrf = Application.GetOpenFilename("Text Files (*.csv),*.csv", , "Provide Text or CSV File:")
With wsheet.QueryTables.Add(Connection:="TEXT;" & file_mrf, Destination:=wsheet.Range("B2"))
  .TextFileParseType = xlDelimited
  .TextFileCommaDelimiter = True
  .Refresh
End With
End Sub

【讨论】:

  • 谢谢你的回答。我想传输大约 600 万行的添加数据来访问数据库。使用 QueryTable 对象,我找不到传输它的方法。
  • 什么是“600 万行”?你的意思是600万行?您可能需要 PowerQuery 或真正的数据库。 Access 只能处理 2GB 的数据。还有很多其他的替代方案,其中许多可以处理数亿行、数十亿行或更多行。
  • 这是一个 0.5 GB 的文件。最终目的地是 MS SQL Server。问题是由于限制,我不能使用 BULK 插入。我使用了带有解析的文本流,但加载时间为 2 小时。对于一个文件没关系,但每个月可以有几个。这个想法是将其放入 Access 然后转移到 DWH。我想避免Server Studio的导入向导
  • 在将读取的数据加载到 SQL Server 之前,您会对其进行任何处理吗?什么样的治疗?过滤、格式化、删除记录?
  • @ASH,在 3 列中,Access 可以在其 2GB 限制内存储多行位大小的数据。看到这个旧帖子:Maximum number of rows in an MS Access database engine table?
【解决方案3】:

这是解决问题的语法:

'createSQL = _
     "SELECT * INTO newlyСreatedTableName" & _ 
     " FROM [fileName.csv] IN 'folderPath' [""Text;HDR=YES;FMT=Delimited""]"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    相关资源
    最近更新 更多