2013-05-11 3 views
0

У меня есть серьезная проблема здесь. Любая помощь очень ценится !!сравнить огромные текстовые файлы с помощью vba

У меня есть два огромных текстовых файла (130 МБ), каждый из которых содержит тысячи записей. Мне нужно сравнить два файла с помощью 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 
+0

Для лучшей читаемости я могу предложить вам упростить пример, может быть, четыре колонки? – Floris

+0

что вы ТОЧНО спрашиваете? Потому что на данный момент похоже, что вам нужно разобраться с блок-схемой, чтобы понять, с какой логикой и процессом вы можете решить проблему. Выбор языка и начало фазы кодирования - это не первое, что нужно сейчас ... –

+1

Чтобы получить полезный ответ, прочитайте FAQ с инструкциями http://stackoverflow.com/questions/how-to-ask и личным фаворитом: http://mattgemmell.com/2008/12/08/what-have-you-tried –

ответ

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

Вы можете сделать это с помощью формул:

См

Г.И. ве вам идею, в принципе, если у вас есть два списка в столбцах & B, можно использовать формулы, как показано ниже в столбцах С и D, чтобы показать соответствие или несоответствующим:

В С1,

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

и, в D1

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

и скопированы вниз.

ДОПОЛНИТЕЛЬНОГО ЧТЕНИЯ:

Смежные вопросы