Microsoft Access:从多个文件的列表中导入CSV文件

时间:2013-05-27 15:25:43

标签: vba ms-access

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

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

  1. 按区域名称将文件分成小文件(即每个区域8000个文件),并每次导入它们以进行访问,或者

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

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

3 个答案:

答案 0 :(得分:2)

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

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

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

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

编辑重新评论

根据您的说明,如果您从不需要跨地区查询(并记住“never”是非常很长时间™)那么你的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文件的名称,

  • 所需的日期范围。

答案 1 :(得分:2)

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

但是,我不想在你的情况下这样做。 10 GB是在Access中合理管理的数据太多。如果将其分区为单独的db文件,则查询从多个db文件中提取的数据具有挑战性并且速度很慢。此外,如果查询的组合结果集达到2 GB访问限制,则会出现有关磁盘空间不足的混淆错误。

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

答案 2 :(得分:1)

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

但是,如果你坚持在严格的Access中这样做,这里有两个相关的想法。这两种想法都要求您根据需要链接和解除链接(使用VBA)所需的数据。


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

  • 肯定:您无需更改现有数据格式。
  • 缺点:您无法编辑现有数据,也无法将其编入索引, 所以查询可能会很慢。

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

  • 肯定:您可以编辑现有数据,也可以将其编入索引 查询可能很快。
  • 缺点:为了避免使用a,这是一项可怕的工作 不同的后端DB。