Powolne odczyt z pliku xls z wykorzystaniem biblioteki npoi

0

Witam wszystkich, potrzebuje stworzyć funkcjonalność która będzie przechodziła przez wszystkie wiersze pliku excel'owego(xls) i dla każdego mojego wewnętrznego id sprawdzała czy pozycja o tym id w tym samym pliku się powtarza, jeżeli tak to w wierszu z pierwszym wystąpieniem danego id w kolumnie obok o nazwie "Ilość"(double) dodaje wartość z każdego kolejnego wystąpienia, a w każdym kolejnym wystąpieniu zmienia wartość na ujemną(tak żeby potem te wszystkie powtórzone wiersze usunąć). Funkcjonalność na razie wygląda tak:

                    for (int row = 1; row <= sheet.LastRowNum; row++)
                    {
                        string cellValue = GetStringCellValue(sheet.GetRow(row).Cells[kolumnaPorownania]);
                        if (cellValue == null)
                        {
                            break;
                        }
                        for (int j = row; j < sheet.LastRowNum; j++)
                        {
                            if (row == j)
                            {
                                continue;
                            }
                            ICell compareCell = sheet.GetRow(j).GetCell(kolumnaPorownania);
                            if (compareCell == null)
                            {
                                break;
                            }
                            string compareCellValue = GetStringCellValue(compareCell);
                            if (cellValue == compareCellValue)
                            {
                                double cellIloscValue = sheet.GetRow(row).Cells[kolumnaIlosc].NumericCellValue;
                                double compareCelIlosclValue = sheet.GetRow(j).Cells[kolumnaIlosc].NumericCellValue;
                                if (cellIloscValue > 0 || compareCelIlosclValue > 0)
                                {

                                    sheet.GetRow(row).Cells[kolumnaIlosc].SetCellValue(cellIloscValue + compareCelIlosclValue);
                                    sheet.GetRow(j).Cells[kolumnaIlosc].SetCellValue(-100);
                                }
                            }
                        }
                    }

Pętle mieli bardzo bardzo długo, nawet nie że wynik z jeden i drugiej, ale prawie każda iteracja pierwszej(głównej) pętli trwa sekunde-dwie.
Mój problem polega na tym że nie mam pojęcia czemu. Wierszy jest jakieś 450, a iteracja idzie wolno nawet przy jednorazowym przejściu, debug'uje ale z tego mi nic nie wychodzi.
Czy jest w tym kodzie może jakiś błąd którego ja po prostu nie widzę albo nie rozumiem?
Liczę na pomoc, bardzo zależy mi żeby naprawić ten problem.

0

Zamiast pętli w pętli, zrób dwie pojedyncze pętle:

  • pierwsza pętla zlicza wystąpienia idków
  • druga pętla przypisuje wartości z policzonej tablicy

z 101475 interakcji z wierszami (O(n^2)) zejdziesz do jedynie 900 (O(2*n)) ;)

0

Zmiana na dwie pętle faktycznie sprawia że nie zajmuję to wieczności ale dalej bardzo długo, jak już wspominałem każde pojedyncze przejście po pętli się dłużyło. Nie ma innej opcji niż po prostu zacząć od zrzucenia wszystkich danych na swoje klasy i dopiero potem na nich operować.

Dzięki za odpowiedź!

1 użytkowników online, w tym zalogowanych: 0, gości: 1