1

我将尝试提供尽可能多的细节,因此我对这个冗长的问题表示歉意。

我试图通过文本文件循环两次,合并两行中的数据,并将其写入该 VBA 所在的 Access 数据库 (accdb) 中的表中。

我先道歉,我只做了简单的 VBA 处理,我不知道如何排序、搜索和合并。我已经搜索了这个论坛,但无法识别有帮助的代码示例。

这是一个包含数百万行的文本文件。每一行都包含关于一个项目的大量信息。

在每一行中:

第 1-8 列:项目 ID。
专栏 20-21:行动代码
第 31-38 列:生效日期。

我需要做的是(我正在简化它):遍历文件并找到操作代码= X5的所有项目。

当我找到“X5”的动作时,我需要找到这个特定项目的下一个动作,看看它是什么动作。

比用项目 ID、生效日期第 1 行、操作代码第 1 行(将是 X5)、生效日期第 2 行、操作代码第 2 行写入数据库。

这个项目我还需要一些其他的数据,但核心是以上五个字段。

例子:

ItemID、生效日期、操作代码
1111、20010312、A3
1111、20070428、X5
1111、20070629、Z2
1111、20090312、Z3
2222、20070428、M2
2222、20070629、Z6
2222、20090312、X5
3333、20070428、X4
3333、20070629、L3

在此示例中,我将仅向数据库写入一行:

1111、20070428、X5、20070629、Z2

对于 2222,虽然有 X5 动作,但之后没有其他动作。

我不确定文件是否已排序,因此我可能需要将其读入两个记录集(或您可能拥有的任何其他想法)并对其进行排序。

感谢您提供的任何代码示例。非常感谢你的帮助。

4

1 回答 1

1

您正在为您建议的方法提出问题,即通过排序循环两次文本数据。这将涉及大量代码,鉴于 Access 的本机功能,这将是不必要的。

您最好将数据导入原始数据/临时表(使用 Access 的数据导入向导,保存导入定义,然后DoCmd.TransferText在代码中使用将数据拉入表中)。

从那里,您可以OpenRecordset将原始数据作为单个 DAO 记录集按需要进行排序,并打开您的目标记录集。循环遍历数据,获取您的第一条记录值,MoveNext并在适当的情况下获取第二条记录值,然后AddNew到您的目标数据库,分配找到的值,然后Update.

鉴于您的源数据有数百万行,您可能想要删除原始/临时数据,甚至删除整个原始/临时表。

您应该能够从这里找到大量 DAO 代码示例来帮助您。

这种方法的唯一缺点是它往往比纯粹的内存方法慢,并且 .ACCDB 文件会不必要地膨胀并需要定期压缩。

如果您想使用内存中的方法(对于这么多数据可能容易出现内存不足错误),您需要逐行读取数据(在 VBA 的 Open & Line Input 上寻求帮助#) 到具有自定义默认成员的自定义类的数组中(这是晦涩难懂的:此处的详细信息),这是一个排序键,用于连接您要排序的所有字段。然后对其进行排序(此处的MedianThreeQuickSort1是我发现的最好和最快的 VBA 排序代码),并按照我对 DAO 代码的建议或多或少地逐步遍历数组。

这将只涉及一个循环数据,并且可能比数据集的两个未排序循环更少的内存使用。

于 2013-07-25T01:56:18.430 回答