Как сравнить два файла Excel с одним столбцом, которые имеют строки 500 000 КБ - PullRequest
0 голосов
/ 10 марта 2020

Цель: сравнить два файла Excel, каждый из которых имеет только один столбец, но содержит полмиллиона строк. Я просто хочу увидеть необычные значения между двумя исключениями.

Колонка: только 1 Строка: 500 000

Язык: JAVA

Что я пробовал до сих пор:

  1. Apache POI используется (см. ниже программу-1)
  2. ArrayList (см. ниже программу-2)
  3. Я пробовал некоторые сайты, где мы можем загрузить кратные Excel, чтобы увидеть различия (https://www.textcompare.org/excel/)
  4. Я увеличил размер кучи до 256 до 2048 м, но у меня не работает.

(Мои программы работают хорошо для небольшого набора данных или нескольких записей)

вышеуказанные усилия не сработали для меня.

программа-1 ::

import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;

public static ExcelReader excel3 = null;
public static ExcelReader excel2 = null;

excel3 = new ExcelReader("C:\\Users\\DataExcelCompare\\Book3.xlsx");
excel2 = new ExcelReader("C:\\Users\\DataExcelCompare\\Book2.xlsx");

    File f3 = new File("C:\\Users\\DataExcelCompare\\Book3.xlsx");      
        FileInputStream fi3 = new FileInputStream(f3);
        Workbook workbook3 = WorkbookFactory.create(fi3);
        Sheet sheet3 = workbook3.getSheet("book3");     

        File f2 = new File("C:\\Users\\DataExcelCompare\\Book2.xlsx");      
        FileInputStream fi2 = new FileInputStream(f2);
        Workbook workbook2 = WorkbookFactory.create(fi2);
        Sheet sheet2 = workbook2.getSheet("book2"); 

         int firstRow2 = sheet2.getFirstRowNum();
         int lastRow2 = sheet2.getLastRowNum();

         int firstRow3 = sheet3.getFirstRowNum();
         int lastRow3 = sheet3.getLastRowNum();

            for(int i=firstRow2; i <= lastRow2; i++) { 
             for(int j=firstRow3; j <= lastRow3; j++) {

                String ele2 = sheet2.getRow(i).getCell(0).toString().trim();
                String ele3 = sheet3.getRow(j).getCell(0).toString().trim() ;

                 if(ele2.toString() !=  ele3.toString())
                 {
                    // some operation 
                 }
                 else
                 {
                    // some operation   
                 }

             }

программа-2 ::

ArrayList<String> listOne = new ArrayList<String>();
ArrayList<String> listTwo =new ArrayList<String>();

         for(int i=firstRow2; i <= lastRow2; i++) {
             listOne.add(sheet2.getRow(i).getCell(0).toString().trim());
             System.out.println("added: " + sheet2.getRow(i).getCell(0).toString().trim());
         }

         for(int j=firstRow3; j <= lastRow3; j++) {
             listTwo.add(sheet3.getRow(j).getCell(0).toString().trim());
             System.out.println("added: " + sheet3.getRow(j).getCell(0).toString().trim());
         }

            listTwo.removeAll(listOne);

            System.out.println("list two : " + listTwo);

1 Ответ

0 голосов
/ 10 марта 2020

Чтение файлов Excel с использованием Apache POI чрезвычайно интенсивно использует память.

Ошибки памяти при работе с файлами Excel с количеством строк менее 50 000 нередки (не говоря уже о 500 000 x 2).

Это никогда не сработает.

Найдите стороннюю программу для преобразования этих файлов Excel в .txt, прежде чем они достигнут вашей Java программы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...