2017-01-18 6 views
1

첫 번째 열에 만 데이터가있는 Excel (.xlsx) 파일이 있습니다. 내 목표는 데이터가 포함 된 마지막 행을 찾는 것입니다. 지금 당장, 각 셀을 하나씩 (첫 번째 행부터) 확인하여 null인지 확인합니다. 그러나 Excel 조회는 상당히 비쌉니다. ~ 10,000 데이터 포인트가있을 때 마지막 행을 찾는 데 10 초 이상 걸립니다.마지막 Null이 아닌 셀을 찾기 위해 Excel 범위에서 이진 검색을 수행하려면 어떻게해야합니까?

선형 검색 대신 균형 이진 검색을하고 싶습니다. 100,000 개가 넘는 행은 절대 없을 것이라고 가정하고, 최대 15 개의 행을 가정하는 작은 예제를 살펴 보겠습니다. Balanced Binary Search Tree

마지막 행이 검색 경로는 다음과 같이 보일 것이다 그런 11.한다고 가정 해 봅시다 :

Row 8 = filled, next search = 12 
Row 12 = null, next search = 10 
Row 10 = filled, next search = 11 
Row 11 = child node, last data row found. 

이 필요 엑셀 읽기 4 (3가 노드 값이기 때문에 당신이 (11)을 포함하지 않는 경우) 대 검색이 선형 인 경우 11.

다음은이 Excel에서 어느 쪽이든을 읽고 4 필요 4.

Row 8 = null, next search = 4 
Row 4 = filled, next search = 6 
Row 6 = null, next search = 5 
Row 5 = null & child node, last data row must be 4. 

에 대한 같은 일입니다. 그러나 최대 행 수가 100,000 인 더 큰 규모에서 이진 검색의 평균 실행 시간은 훨씬 더 깁니다.

누군가가 C#에서 이러한 종류의 검색을 구현하는 데 도움을 줄 수 있습니까?

이 질문이 Trying to find the last non-empty cell in a specific row/range over multiple sheets인데 Excel 수식을 사용하지 않고 C#에서이 알고리즘을 알아내는 데 관심이 있습니다. 마지막 가능한 행을 알고 있다면

string value = myWorksheet.Cells[3, 4].Text; // row 3, column 4 
+0

@dasblinkenlight 엑셀 Interop를. 라이브러리에 익숙하지 않은 사람들을위한 샘플을 추가하고 Interop 태그를 추가했습니다. – arbitrarystringofletters

+0

UsedRange가 작동하지 않습니까? – JohnG

+0

아니요, 셀 값이 삭제되지 않는다고 보장 할 수는 없습니다. "사용 된 범위에는 사용 된 모든 셀이 포함됩니다. 예를 들어, 셀 A1에 값이 포함 된 다음 값을 삭제하면 셀 A1 이 경우 UsedRange 속성은 셀 A1을 포함하는 범위를 반환합니다. " [- Microsoft 문서] (https://msdn.microsoft.com/en-us/library/microsoft.office.tools.excel.worksheet.usedrange.aspx) – arbitrarystringofletters

답변

2

, 당신은 다음과 같이 당신의 엑셀 데이터를 이진 검색을 실행할 수 있습니다 여기에

는 Microsoft.Office.Excel.Interop에서 셀의 값을 얻기위한 구문입니다 :

var first = 0; 
var last = 10000; 
while (first+1 < last) { 
    var mid = (first+last)/2; 
    if (string.IsNullOrEmpty(myWorksheet.Cells[mid, 1].Text)) { 
     last = mid; 
    } else { 
     first = mid; 
    } 
} 

Demo.

+0

이것은 매우 훌륭하게 작동하며 매우 간단합니다. 도와 주셔서 감사합니다! – arbitrarystringofletters