VBA - 读取文本文件,搜索与当前行匹配的下一行,然后合并

时间:2013-07-25 00:11:08

标签: vba ms-access

我会尝试提供尽可能多的细节,以便为长期问题道歉。

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

我在前面道歉,我只做了简单的VBA处理,我不知道如何排序,搜索和合并。我搜索了这个论坛,但无法确定有用的代码示例。

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

每一行:

Columns 1-8: Item ID.
Column 20-21: Action Code
Columns 31-38: effective date.

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

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

使用Item ID,生效日期Row1,动作代码Row1(将是X5),生效日期Row2,动作代码Row2,向数据库写入一行。

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

示例:

ItemID, Effective Date, Action Code
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动作,但之后没有其他动作。

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

您应该可以找到大量的DAO代码示例来帮助您。

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

如果您想使用内存中的方法(可能会因为那么多数据而容易出现内存不足错误),您需要逐行读取数据(在VBA的Open上查找帮助) & Line Input#)到一个自定义类的数组中,其中包含一个自定义默认成员(这是模糊和棘手的:详细信息here),这是一个连接所有要排序的字段的排序键。然后对它进行排序(来自here的MedianThreeQuickSort1是我发现的最好和最快的VBA排序代码),并按照我建议的DAO代码或多或少地逐步完成数组。

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