使用vba比较大文本文件

时间:2013-05-11 18:14:37

标签: excel vba text excel-vba

我在这里遇到了严重的问题..非常感谢任何帮助!!

我有两个巨大的文本文件(130 MB),每个文件都有数千条记录。我需要使用vba或任何方法比较这两个文件,并生成一个包含标题和另外两列的电子表格。另外两列将是文件名,在下一列中,它应显示哪个特定列是错误的。每条记录都会有多个差异。一个文件可以包含在另一个文件中找不到的记录。因此,这个条件也应该记录在电子表格中。

示例:

Media Events: Taking one record from each.
00000018063|112295|000|**0009**|

PROL:
00000018063|112295|000|**0013**|

在上面的示例中,记录来自两个文件。突出显示的是记录之间的差异。所以输出应该是这样的..

HH_NUMBER     | CLASS_DATE  |   MV_MIN  DURATION   File Mismatc     Mismatch Reason
00000018063   |   112295    |    000    **0009**   Media Events     Mismatches in DURATION
00000018063   |   112295    |    000    **0013**   PROL             Mismatches in DURATION
00000011861   |   112295    |    002      0126     Media Events     missing in PROL file

2 个答案:

答案 0 :(得分:2)

这里似乎有三个问题:

1)查找两个文件之间的匹配记录(第一列)。

2)比较第一列匹配的记录 - 如果存在差异,则记录差异

3)如果一个文件中存在记录但不存在另一个文件,则记录该记录。

我将假设两个“巨大文件”实际上是同一个excel工作簿中的单独工作表,并且记录按第一个键排序。这将显着加快处理速度。但我认为,速度是次要问题。我还假设你输出了第三张纸。

以下是VBA代码的概述 - 您必须做一些工作才能使它“适合”您的应用程序,但我希望这能让您顺利进行。

Sub compare()
Dim s1 as Worksheet
Dim s2 as Worksheet
Dim col1 as Range
Dim col2 as Range
Dim c as Range
Dim record1 As Range, record2 As Range, output As Range
Dim m
Dim numCols as Integer

numCols = 5 ' however many columns you want to compare over

Set s1 = Sheets("Media")
Set s2 = Sheets("Pro")
Set output = Sheets("output").Range("A2")

Application.ScreenUpdating = False
s1.Select
Set col1 = Range("A2", [A2].End(xlDown));
s2.Select
Set col2 = Range("A2", [A2].End(xlDown));

On Error Resume Next
For Each c in col1.Cells
  m = Application.Match(c.Value, col2, 0);
  If isError(m) Then
    ' you found a record in 1 but not 2
    ' record this in your output sheet
    output.Value = "Record " & c.Value & " does not exist in Pro"
    Set output = output.Offset(1,0) ' next time you write output it will be in the next line
    ' you will have to do the same thing in the other direction - test all values
    ' in 2 against 1 to see if any records exist in 2 that don't exist in 1
  Else
    ' you found matching records
    Set record1 = Range(c, c.offset(0, numCols))
    Set record2 = Range(col2.Cells(m,1), col2.Cells(m,numCols))
    ' now you call another function to compare these records and record the result
    ' using the same trick as above to "go to the next line" - using output.Offset(1,0)
  End If
Next c
End Sub

答案 1 :(得分:1)

您可以使用公式执行此操作:

为了给你一个想法,基本上,如果你在A列和A列中有两个列表。 B,您可以在C和D列中使用如下公式来显示匹配或不匹配:

在C1中,

=If(isna(match(A1,B:B,0)),A1,"")

,在D1

=IF(Isna(Match(B1,A:A,0)),B1,"")

都被复制了下来。

进一步阅读: