将大型 .csv 文件导入 Excel,

Posted

技术标签:

【中文标题】将大型 .csv 文件导入 Excel,【英文标题】:Importing a large .csv into Excel, 【发布时间】:2013-05-14 15:34:07 【问题描述】:

我试图将一个大的 .csv 文件导入 Excel。该文件有近 400 万行和 329 列,因此远远超过 Excel 的 65536 1M 行限制。我在网上找到了一个 VB 脚本,可以将文本文件导入 Excel,一旦超出行数限制,脚本就会创建一个新工作表,直到所有工作表中的总行数等于原始文本文件中的总行数。

Sub ImportLargeFile()
'Imports text file into Excel workbook using ADO.
'If the number of records exceeds 65536 then it splits it over more than one sheet.

Dim strFilePath As String, strFilename As String, strFullPath As String
Dim lngCounter As Long
Dim oConn As Object, oRS As Object, oFSObj As Object

'Get a text file name
strFullPath = Application.GetOpenFilename("Text Files (*.csv),*.csv", , "Please select text file...")

If strFullPath = "False" Then Exit Sub  'User pressed Cancel on the open file dialogue

'This gives us a full path name e.g. C:\temp\folder\file.txt
'We need to split this into path and file name
Set oFSObj = CreateObject("SCRIPTING.FILESYSTEMOBJECT")

strFilePath = oFSObj.GetFile(strFullPath).ParentFolder.Path
strFilename = oFSObj.GetFile(strFullPath).Name


'Open an ADO connection to the folder specified
Set oConn = CreateObject("ADODB.CONNECTION")
oConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
           "Data Source=" & strFilePath & ";" & _
           "Extended Properties=""text;HDR=Yes;FMT=Delimited"""

Set oRS = CreateObject("ADODB.RECORDSET")

'Now actually open the text file and import into Excel
oRS.Open "SELECT * FROM " & strFilename, oConn, 3, 1, 1
While Not oRS.EOF
    Sheets.Add
    ActiveSheet.Range("A1").CopyFromRecordset oRS, 65536
Wend

oRS.Close
oConn.Close

End Sub

但是,当我在 Excel 2007 中运行它时,我收到以下错误:

Run-time error '-2147217900 (80040e14)':

Syntax error in FROM clause.

点击调试时它指向这一行

    oRS.Open "SELECT * FROM " & strFilename, oConn, 3, 1, 1

我不具备 VB 技能,因此我们将不胜感激。

谢谢!

编辑:我发现了这个http://support.microsoft.com/kb/193514,但在这种情况下这不起作用,事实上,我什至不确定在哪里放置方括号。我把括号放在那一行的任何地方,Excel 都拒绝给我运行选项。

编辑 2:我尝试在另一台机器上运行它,它有更多的汁液,使内存不再是问题。这台计算机上还装有 Office 2013(虽然没有 Office 365)。我在上面运行了相同的宏,它给出了以下错误。

Run-time error '3706':
Provider cannot be found. It may not be properly installed.

当我点击调试时它指向这一行

oConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
       "Data Source=" & strFilePath & ";" & _
->     "Extended Properties=""text;HDR=Yes;FMT=Delimited"""

【问题讨论】:

我也不知道vba,但是SELECT这部分是SQL,我懂一点。您能否包含您的 csv 标题以及您从哪里获得 vba 脚本? 标题与列不同吗?如果我听起来很迟钝,请原谅我,但 VB 对我来说真的是完全陌生的。 不不,这很好问。通过标题,我的意思是你的 csv 中的列名,如果你有的话。您提供的 MS 支持链接提到您正在导入的文件中包含破折号的列标题/名称会导致此错误。相反,如果您知道如何使用它并将较小的部分导出到 Excel,则可以在 MS Access 中导入文件。不过,在到达那里之前,我想看看你从哪里得到这个 vba 脚本,也许那里有一些指导方针。 尝试添加Debug.Print "SELECT * FROM " & strFilename,看看你在即时窗口中得到了什么(在VB编辑器中按Ctrl+G)。你的文件名有空格吗? 如果确实有空格,那么您需要在 SQL 中将文件名包含在 [] 中。 oRS.Open "SELECT * FROM [" & strFilename & "]"blogs.technet.com/b/heyscriptingguy/archive/2005/05/24/… 【参考方案1】:

您是否研究过 PowerPivot?它是 Microsoft 的免费插件。它将允许您连接到原始数据源,或使用整个 CSV,并加载数百万行(超出单元格限制)。您可以汇总数据透视表中的数据、对数据应用函数等。PowerPivot 专为您的情况量身定制。

Download

【讨论】:

PowerPivot 看起来很有希望,但糟糕的是它需要为 Office 2013 安装 Office 365,这是我刚刚在具有更多果汁的机器上升级到的。 大声笑,在写完这个答案 7 年后,它收到了第一个支持。谢谢你是谁!【参考方案2】:

据我所知,Excel 2007 没有 65K 的限制。只需尝试直接导入 csv。

编辑:评论告诉它有 1M 的限制,因此需要拆分文件。如果它很简单(没有带换行符的引用文本),那么 split 和 head 会有所帮助。它们在 Windows 下也可用。

【讨论】:

据此msdn.microsoft.com/en-us/library/… Excel 2007 的限制是 100 万行,但仍然少于此文件的行数。正在导入的文件的名称中没有“-”,但确实有一个空格此外,我确实尝试在 Excel 中打开它 - 事实上这是我做的第一件事。没用。 Excel 2007 的实际限制现在约为 1M。在 Excel 2003 中为 65536。 我不希望将其拆分并保存在一个包含多张工作表的工作簿中,这就是脚本出现的原因。

以上是关于将大型 .csv 文件导入 Excel,的主要内容,如果未能解决你的问题,请参考以下文章

如何快速将大型 CSV 文件导入数据库

markdown 如何将大型CSV文件导入我们的存储?

需要通过 PHP 将大型 CSV 文件导入多个 MySQL 表的高效方法

macmatlab导入大型csv

使用 CSV Importer 插件将大型 CSV 导入 Wordpress

使用 ADO 将大型 csv 文件导入 mdb 时的性能问题