с недели я пытаюсь добиться успеха в своей теме, но не могу найти приемлемого решения. Я имею в виду, ... у меня есть рабочее решение, но сравнение занимает около половины дня: -S
Предпосылка:
Оба csv-файла уже скопированы в локальную книгу. они присутствуют и готовы играть с ними. каждый файл имеет ~ 6000 строк и 4 столбца.
столбец A: название документа / версия
колонка B: тема1
колонка C: subject2
колонка D: логический артефакт
оба CSV-файла имеют одинаковую структуру.
столбец A содержит имя документа и его последнюю версию.
каждая строка содержит комбинацию: имя документа / версия, subj1, subj2, логическое значение
Примеры новых CSV_old, включая комментарии / изменения для csv_new в column_E
Document/Version Subj1 Subj2 BOOLEAN
DOC_1/Vers1 FUN GERMANY FALSE
DOC_2/Vers3 FUN GERMANY TRUE
DOC_2/Vers3 FUN UK TRUE <- to be deleted in CSV_new
DOC_2/Vers3 FUN FRANCE TRUE
DOC_3/Vers7 ACTION GERMANY FALSE <- Version Update in CSV_new
DOC_4/Vers4 MOVIE UK TRUE
DOC_6/Vers1 HELP SPAIN FALSE
DOC_7/Vers2 FUN GERMANY FALSE <- boolean: true in CSV_new
DOC_8/Vers5 FUN FRANCE TRUE <- Subj1: ACTION instead of FUN
CSV_new
Document/Version Subj1 Subj2 BOOLEAN
DOC_1/Vers1 FUN GERMANY FALSE
DOC_2/Vers3 FUN GERMANY TRUE
DOC_2/Vers3 FUN UK TRUE
DOC_2/Vers3 FUN FRANCE TRUE
DOC_3/Vers9 ACTION GERMANY FALSE <- Version Updated
DOC_4/Vers4 MOVIE UK TRUE
DOC_5/Vers5 DANGER UK FALSE <- new/added Row in CSV_new
DOC_6/Vers1 HELP SPAIN FALSE
DOC_7/Vers2 FUN GERMANY FALSE <- boolean updated to true
DOC_8/Vers5 ACTION FRANCE TRUE <- Subj1: ACTION instead of FUN
Цель:
Сравните два файла CSV (оба получены из базы данных). Каждый файл является производной версией из огромной базы данных (выдержка). Я хотел бы проверить старый CSV-файл (например, версия 2.0, csv_old) с более новым (например, версия 4.1, csv_new).
Таким образом, я хотел бы увидеть различия между обеими производными версиями (выдержками) базы данных. Могут быть новые вставленные / добавленные строки, а также удаленные строки.
Пока что я получил код, который работает, но занимает слишком много времени. Я вставляю своего рода псевдокод, чтобы дать вам представление о моем подходе (он содержит только один шаг сравнения):
Для rowInOldCSV = 3 к листам ("_ ws_oldCSV"). Диапазон ("A65536"). Конец (xlUp). Строка
Set findSameDocumentNumberInColumnA = Sheets(givenActiveWS).Cells.Find(Sheets("_ws_oldCSV").Range("A" & rowInOldCSV & ":D" & rowInOldCSV).Value, LookIn:=xlValues)
Set findSameDocumentNumberInColumnA_withoutVers = Sheets(givenActiveWS).Cells.Find(Left(Sheets("_ws_oldCSV").Cells(rowInOldCSV, 1).Value, Len(Sheets("_ws_oldCSV").Cells(rowInOldCSV, 1).Value) - 5), LookIn:=xlValues)
If Not findSameDocumentNumberInColumnA Is Nothing Then
'document/version found!
firstAddress = findSameDocumentNumberInColumnA.Address
Do
'if subj1+subj2 are same
If (Sheets(givenActiveWS).Cells(findSameDocumentNumberInColumnA.Row, 2).Value = Sheets("_ws_oldCSV").Cells(rowInOldCSV, 2).Value) And _
(Sheets(givenActiveWS).Cells(findSameDocumentNumberInColumnA.Row, 3).Value = Sheets("_ws_oldCSV").Cells(rowInOldCSV, 3).Value) Then '....and boolean-value the same
'Sheets("_ws_oldCSV").Range("A" & rowInOldCSV & ":D" & rowInOldCSV).Copy 'takes even longer
'Sheets(givenActiveWS).Cells(findSameDocumentNumberInColumnA.Row, 6).PasteSpecial Paste:=xlPasteValues
Sheets(givenActiveWS).Cells(findSameDocumentNumberInColumnA.Row, 6).Value = Sheets("_ws_oldCSV").Cells(rowInOldCSV, 1).Value
Sheets(givenActiveWS).Cells(findSameDocumentNumberInColumnA.Row, 7).Value = Sheets("_ws_oldCSV").Cells(rowInOldCSV, 2).Value
Sheets(givenActiveWS).Cells(findSameDocumentNumberInColumnA.Row, 8).Value = Sheets("_ws_oldCSV").Cells(rowInOldCSV, 3).Value
Sheets(givenActiveWS).Cells(findSameDocumentNumberInColumnA.Row, 9).Value = Sheets("_ws_oldCSV").Cells(rowInOldCSV, 4).Value
'leave loop
Exit Do
End If
Set findSameDocumentNumberInColumnA = Sheets(givenActiveWS).Cells.FindNext(findSameDocumentNumberInColumnA)
Loop While Not findSameDocumentNumberInColumnA Is Nothing And findSameDocumentNumberInColumnA.Address <> firstAddress
Else
'document/version not found
If Not findSameDocumentNumberInColumnA_withoutVers Is Nothing Then
'document found, looks like new version
'mark it with yellow to show updated version
Else
'unkown document, means new introduced since csv_old
'copy it under last item in RowF
'
End If
End If
next rowInOldCSV
Пока что до моего подхода. Я видел два разных:
http://www.ms -office-forum.net / форум / showthread.php? Т = 279399
а также
Excel VBA: диапазон до строкового массива за 1 шаг
оба, кажется, работают довольно хорошо и очень быстро, но, к сожалению, я не могу использовать его для моего сценария.
Полагаю, мне нужно поместить значения из столбца в массив строк, чтобы начать сравнение? У меня нет идей, и я понятия не имею, как обрабатывать значения столбцов в массивах строк. Извините, ...
Вы можете мне помочь?
Результат сравнения: было бы неплохо записать материал в CSV_new.
Doc/Vers Subj1 Subj2 BOOLEAN Doc Subj1 Subj1 Boolean
DOC_1/Vers1 FUN GERMANY FALSE - - - -
DOC_2/Vers3 FUN GERMANY TRUE - - - -
DOC_2/Vers3 FUN UK TRUE Deleted - - -
DOC_2/Vers3 FUN FRANCE TRUE - - - -
DOC_3/Vers9 ACTION GERMANY FALSE Updated - - -
DOC_4/Vers4 MOVIE UK TRUE - - - -
DOC_5/Vers5 DANGER UK FALSE New - - -
DOC_6/Vers1 HELP SPAIN FALSE - - - -
DOC_7/Vers2 FUN GERMANY TRUE - - - X
DOC_8/Vers5 ACTION FRANCE TRUE - X - -
Большое, большое спасибо заранее за ваши усилия !!!!! : О)