【问题标题】:Microsoft Access: Import CSV file from a list of multiple filesMicrosoft Access:从多个文件列表中导入 CSV 文件
【发布时间】:2013-05-28 02:14:48
【问题描述】:

我有一个大约 10 GB 的 *.csv 格式的大文件。这是不同地区从 1960 年至今的数据。我能够按区域分解文件。大约有 8000 个区域,我按区域拆分文件,所以我有 8000 个文件,每个文件大约 2 MB。

我想知道创建 Access 数据库系统以查找每个区域的数据的最有效方法是什么。是不是:

  1. 将文件按区域名称分成小文件(即按区域8000个文件),每次都导入访问,或者

  2. 将它们分成大约 1 GB 的恒定大小并查询它们。

在任何一种情况下,如何将文件导入 Access?

【问题讨论】:

    标签: vba ms-access


    【解决方案1】:

    您可能知道,Access 数据库文件的大小限制为 2GB,因此您几乎可以肯定无法将所有信息保存在一个文件中。即使它只是勉强适合,将这么多信息保存在单个 Access 数据库文件中也可能会相当缓慢。

    根据您数据的“形状”,Access 中可能存在其他限制,可能会在您的特定情况下造成困难。例如,一个表(或查询)被限制为 255 列。如果您还没有这样做,请先查看Access specifications,然后再继续进行更多操作。

    无论如何,请考虑使用另一个数据库作为后端。对于 SQL Server Express Edition 中的单个数据库,您的数据甚至可能太大(我记得每个数据库的总大小最大为 10GB),但即使您必须将数据拆分为两个 SQL Express 数据库,处理起来也会更容易十几个(或更多?)访问数据库。

    请记住,如果您使用不同的数据库后端,您仍然可以将 Access 用作查询和报告工具(通过 ODBC 链接表)。

    编辑回复:评论

    根据您的描述,如果您从不需要跨区域查询(请记住,“从不”是一个非常很长的时间™) 那么您的 8000 文件方法将是可行的。但是,我不一定建议您每次要运行查询时都导入相应的 CSV 数据。相反,我会从 Tom 和 HansUp 的答案中借用想法:

    计划“A”:首先直接对 CSV 文件本身运行查询,看看这是否足以满足您的需求。您可以通过为 CSV 文件创建 linked table 并运行一些典型查询来测试它。正如 Tom 提到的,CSV 链接表无法被索引,所以如果您发现查询太慢,那么您可能必须转到“B”计划。

    计划“B”:如果您确实需要导入 CSV 数据,那么您可能需要使用 HansUp 的建议,即使用 DoCmd.TransferText 来帮助自动化流程。为每个查询导入特定的 CSV 文件似乎很浪费,因此您可以考虑创建 ~8000 个.accdb 文件,然后使用类似...的查询。

    strSQL = _
            "SELECT * FROM TableName " & _
            "IN ""C:\__tmp\region12345.accdb"" " & _
            "WHERE StartDate BETWEEN #2013-05-10# AND #2013-05-15#"
    

    ...您的代码可以替代的地方

    • 基于感兴趣区域的相应 .accdb 文件的名称,以及

    • 所需的日期范围。

    【讨论】:

    • 戈德谢谢你的回复。由于用户缺乏资源/限制,我不得不为此目的使用访问权限。因此,作为一个解决方案,我对其进行了建模,以便访问可以使用 8000 个大小为 2 MB 的较小文件,并在需要时加载每个文件。我不需要处理跨区域查询,我只需要获取区域编号、开始和结束日期并将其返回给用户。那么 Access 太慢了,无法做到这一点谢谢
    • 谢谢,你能推荐我可以在 Mac 上使用的任何其他数据库系统吗,因为我的 SQL express 不适用于 mac
    • @Ang 我无法对 Mac 软件提出任何具体建议,但似乎 MySQL 和 PostgreSQL 都可用于 Mac OS X。不过我有点困惑:你说你可以'不要使用 SQL Server,因为它对 Mac“不可用”,但 Access 是一个 Windows 应用程序,所以你也不能在 Mac 上使用 Access(无论如何都不是本机的)。您打算如何使用 Access?
    【解决方案2】:

    如果您将使用 VBA 执行此操作,则可以使用 DoCmd.TransferText Method 将 CSV 数据导入 Access。

    不过,在您的情况下,我不想这样做。 10 GB 的数据太多,无法在 Access 中合理管理。如果您将其划分为单独的 db 文件,查询从多个 db 文件中提取的数据是具有挑战性且缓慢的。此外,如果查询的组合结果集达到 2 GB 访问限制,您将收到有关磁盘空间不足的令人困惑的错误。

    这对于 MS Access 中的数据存储来说不是一个合理的工作。

    【讨论】:

    • 您好 HansUp,感谢您的回复。我知道文件太大,Access 无法处理。好消息是我不需要一次查询多个数据库。我需要执行的只是用户将输入区域、开始日期和结束日期,并且数据库必须找到包含我已分成 8000 个文件的数据的文件。我唯一担心的是 Acess 是否可以一次加载一个文件,以及我是否可以这样做。此方法是否有效或查找和加载文件需要很长时间。我知道在 Access 中其他数据库非常困难,但由于用户资源有限,这就是挑战
    • 好的,如果您一次只查询一个 db 文件会更合理。但是,在您描述的情况下,也许您应该根据日期范围而不是 8000 个区域将数据隔离到 db 文件中……也许每十年一个。但是无论您如何拆分数据,我认为您将需要使用 VBA 代码根据用户的搜索值来识别目标数据库文件......并动态调整您的查询 SQL 以匹配。
    【解决方案3】:

    @Gords 和@HansUps 是非常好的答案。为您的数据使用更好的后端。免费的将包括 SQL Express 和 MySQL。如果您在公司环境中,那么您可能拥有 MS SQL Server 的许可证。

    但是,如果您坚持在严格的 Access 中执行此操作,这里有两个相关的想法。这两种想法都要求您根据需要链接和取消链接(使用 VBA)到您需要的数据。


    您无需导入 CSV 文件即可将其视为表格。您可以像链接另一个数据库中的表一样链接到它。

    • 优点:您不必更改现有数据格式。
    • 缺点:您不能编辑现有数据,也不能索引它, 所以查询可能会很慢。

    或者,您可以将每个 CSV 文件转换为它自己的 Access DB(您可以使用 VBA 自动执行此操作)。然后,就像上面的建议一样,根据需要链接和取消链接表格。

    • 正面:您可以编辑现有数据,也可以索引它,所以 查询可能很快。
    • 缺点:为了避免使用 不同的后端数据库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 2016-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多