Лучший код производительности для огромного файла XLS и сравнить записи по одной? - PullRequest
0 голосов
/ 24 июня 2018

Я читаю эту тему больше раз: Эта SO Link о сравнении двух XLS (Excel-файлов), я работаю и пробую несколько небольших примеров.

Я хочу написать код C # с наилучшей производительностью, который читает два огромных файла XLS и сравнивает первую строку файла A со всеми строками файла B. Если первая строка A не встречается во всех строках файла B, списокстрока A и переход к следующей строке A.xls и снова сравнение со всеми строками файла B.

Обновление 1:

(я делаю следующее):

DataTable dt1 = GetDataTableFromExcel(this.Directory, this.FirstFile, this.FirstFileSheetName);
dtRet = getDifferentRecords(dt1, dt2);
var adapter = new OleDbDataAdapter("SELECT * FROM [" + strSheetName + "$]", connectionString);

Обновление 2:

Моя основная проблема возникла, когда Xls содержит 4000 записей!(Огромные файлы)

1 Ответ

0 голосов
/ 25 июня 2018

Поскольку запрашивается OP , вот решение VBA.Догадываясь о нескольких деталях, поэтому OP нужно будет настроить в соответствии с их конкретным вариантом использования

Это работает для меня в <2 с более 4000 строк </p>

Sub Demo()
    Dim wb1 As Workbook, wb2 As Workbook
    Dim ws1 As Worksheet, ws2 As Worksheet
    Dim r1 As Range, r2 As Range
    Dim v1 As Variant, v2 As Variant
    Dim rw1 As Long, rw2 As Long
    Dim cl As Long
    Dim Found  As Boolean

    Const NUM_COLS_COMPARE = 1 'adjust as required

    ' Get Reference to, or open workboks
    Set wb1 = Application.Workbooks("NameOfBook1.xlsx")  'if already open
    Set wb2 = Application.Workbooks.Open("C:\Path\ToWorkbook2.xlsx") 'if not open

    'Get reference to sheets
    Set ws1 = wb1.Worksheets("NameOfSheet1")
    Set ws2 = wb2.Worksheets("NameOfSheet2")

    'get reference to ranges
    '  assuming data in Column A and Row 1fill whole range.  Adjust if necassary
    Set r1 = ws1.Range(ws1.Cells(1, ws1.Columns.Count).End(xlToLeft), _
                       ws1.Cells(ws1.Rows.Count, 1).End(xlUp))
    Set r2 = ws2.Range(ws2.Cells(1, ws2.Columns.Count).End(xlToLeft), _
                       ws2.Cells(ws2.Rows.Count, 1).End(xlUp))

    'Get Data into Array
    v1 = r1.Value2
    v2 = r2.Value2

    For rw1 = 1 To UBound(v1, 1)
        For rw2 = 1 To UBound(v2, 1)
            Found = False
            For cl = 1 To NUM_COLS_COMPARE
                If v1(rw1, cl) = v2(rw2, cl) Then
                    Found = True
                    Exit For
                End If
            Next
            If Found Then Exit For
        Next rw2
        'List Found row
        If Not Found Then
            Debug.Print "No Match for " & rw1, v1(rw1, 1)
        End If
    Next rw1
End Sub
...