0

私はここで深刻な問題を抱えています..どんな種類の助けも大歓迎です!!

それぞれ数千のレコードを含む 2 つの巨大なテキスト ファイル (130 MB) があります。vba または何らかの手段を使用して 2 つのファイルを比較し、ヘッダーと 2 つの追加列を含むスプレッドシートを生成する必要があります。追加の 2 つの列はファイル名で、次の列にはどの特定の列にエラーがあるかが表示されます。各レコードには複数の不一致があります。一方のファイルには、もう一方のファイルでは見つからないレコードが含まれている場合があります。したがって、この状態もスプレッドシートに記録する必要があります。

例:

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

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

上記の例では、レコードは 2 つのファイルからのものです。強調表示されているのは、レコード間の違いです。したがって、出力は次のようになります。

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
4

2 に答える 2

2

ここには 3 つの問題があるようです。

1) 2 つのファイル間で一致するレコード (最初の列) を検索します。

2) 最初の列で一致するレコードを比較します - 違いがある場合は、違いを記録します

3) レコードが一方のファイルに存在し、もう一方のファイルに存在しない場合は、それを記録します。

2 つの「巨大なファイル」は、実際には同じ Excel ワークブック内の別々のシートであり、レコードは最初のキーで並べ替えられていると仮定します。これにより、処理が大幅に高速化されます。しかし、速度は二次的な問題だと思います。また、出力を配置する 3 番目のシートがあると仮定します。

ここに 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
于 2013-05-11T20:44:42.323 に答える
1

数式でこれを行うことができます:

見る

基本的に、列AとBに2つのリストがある場合、列CとDで次のような式を使用して、一致するか一致しないかを示すことができます。

C1では、

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

そして、D1で

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

両方ともコピーされました。

参考文献:

于 2013-05-13T08:46:51.343 に答える