【问题标题】:Looking for efficient methods of loading large excel (xlsx) files into SQL寻找将大型 excel (xlsx) 文件加载到 SQL 中的有效方法
【发布时间】:2013-09-16 19:44:18
【问题描述】:

我正在寻找替代数据导入解决方案。目前我的流程如下:

  1. 在 excel 中打开一个大的 xlsx 文件
  2. 替换所有“|” (管道)带有空格或其他独特字符
  3. 将文件另存为以竖线分隔的 CSV
  4. 使用 SQL Server Management Studio 2008 R2 中的导入向导导入 CSV 文件

该过程有效;但是,步骤 1-3 需要很长时间,因为要加载的文件非常大(大约 100 万条记录)。

根据一些研究,我发现了一些潜在的解决方案: a) 批量导入 - 不幸的是,这并没有消除上面提到的步骤 1-3,因为文件需要转换为平面(或 CSV)格式 b) OpenRowSet/OpenDataSource - 这个问题有 2 个问题。首先,加载需要很长时间(一百万条记录大约需要 2 小时)。其次,当我尝试一次加载多个文件(大约 20 个文件,每个文件包含 100 万条记录)时,我收到“内存不足”错误

我没有尝试过 SSIS;我听说大 xlsx 文件有问题

所以这引出了我的问题。是否有任何解决方案/替代选项可以更快地导入大型 Excel 文件?

非常感谢您的帮助。

【问题讨论】:

  • 我要问一个愚蠢的问题。数据实际上是源自 excel 文件,还是 excel 文件生成的一些输出,您可以在它变成 excel 文件之前获得这些输出。我认为您将在非 Excel 格式中拥有更大的灵活性
  • OPENROWSET 的性能非常糟糕,我经常使用它,并且没有遇到像你的性能那么慢(也运行倍数)。为什么要执行步骤 1-3 而不是仅使用 SSMS 中的导入向导来导入 excel 文件?
  • 这是另一个愚蠢的问题 - 如果要删除所有管道,为什么要将其保存为管道分隔文件?
  • @Rikalous 从字段中删除管道,在保存时将它们添加到字段之间以用作分隔符。而不是使用文本限定符。 (我假设)
  • 我同意 Gary 的观点 - 有人可能不得不花费数小时不必要地创建该 Excel 文件。我确定您已经走上了这条路,但是您有哪些选择可以将其保存为 CSV?

标签: sql sql-server excel csv ssis


【解决方案1】:

我喜欢 Excel 作为一种数据可视化工具,但它作为一个数据传输层并不理想。我的偏好是使用 JET/ACE driver 查询它或使用 C# 查询 non-tabular data

我还没有将它提高到数百万,但我不得不相信第一种方法必须比您当前的方法更快,这仅仅是基于您不必对数据执行双重读取和写入这一事实.

【讨论】:

    【解决方案2】:

    我之前做过的事情(我之所以提出是因为我看到您的文件类型是 XLSX,而不是 XLS)是通过 winzip 打开文件,提取 XML 数据,然后导入它。从 2007 年开始,XLSX 文件实际上是一个 zip 文件,其中包含许多文件夹/文件。如果 excel 文件很简单(不是很多宏、图表、格式等),您可以从后台的 XML 文件中提取数据。我知道你可以通过WINZIP看到它,我不知道其他压缩应用程序。

    【讨论】:

    • 您有博客文章或这种方法的示例吗?我总是有兴趣看到处理问题的新方法
    • 抱歉,没有博客。如果您在 Winzip 中打开它并四处寻找,您将看到 XML 文件。文件/文件夹的名称取决于您的工作表名称,它们也有一些内部文件名。
    • 顺便说一句,您可以尝试将 excel 文件另存为 XML 或固定宽度,这样您就不必从文件中删除 PIKE。反正少了一步。
    • 我可能只是使用 .net 库将其解压缩到内存中,但希望听到有关 xml 解析的细节
    • 这里是一些关于保存固定宽度的信息的链接:superuser.com/questions/100433/…
    猜你喜欢
    • 2015-07-20
    • 2017-07-15
    • 2013-02-09
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多