Есть ли какой-нибудь logi c для сравнения двух словарных документов (docx) и улавливания отсутствующей строки, специальных символов, пробела и всего прочего? - PullRequest
0 голосов
/ 07 августа

Я работаю над сравнением двухсловных документов вручную, где я не должен пропустить никаких строк, специальных символов, пробелов и всего прочего, и этот документ составляет около 150 страниц или более. так что очень головная боль делать сравнение. Затем я написал небольшую программу java для сравнения двух документов, но я не могу перечислить недостающие слова.

Использование библиотеки Apche POI

Заранее спасибо.

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFFooter;
import org.apache.poi.xwpf.usermodel.XWPFHeader;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;

public class ReadDocFile {

    private static XWPFDocument docx;
    // private static String path = "C:\\States wise\\NH\\Assessment
    // 2nd\\test.docx";
    private static ArrayList<String> firstList = new ArrayList<String>(); // refers to first document list
    private static ArrayList<String> secondList = new ArrayList<String>(); // refers to second document list
    private static List<XWPFParagraph> paragraphList;
    private static Map<String, String> map = null; 
    private static LinkedHashSet<String> firstMissedArray = new LinkedHashSet<String>(); // refers to first document Linked hash set
    private static LinkedHashSet<String> secondMissedArray = new LinkedHashSet<String>(); // refers to second document Linked hash set

    
    public static void getFilePath(String path) {

        FileInputStream fis;
        try {

            fis = new FileInputStream(path);
            docx = new XWPFDocument(fis);

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    public static void get_First_Doc_Data() {

        getFilePath("C:\\States wise\\NH\\Assessment 2nd\\test.docx");

        paragraphList = docx.getParagraphs();

        System.out.println("******************** first list Starts here  ******************** ");
        System.out.println();
        
        for (int i = 0; i < paragraphList.size() - 1; i++) {

            firstList.add(paragraphList.get(i).getText().toString());

            System.out.println(firstList.get(i).toString());

        }

        System.out.println("*********** first list Ends here ********************");

    }

    public static void get_Second_Doc_Data() {

        getFilePath("C:\\States wise\\NH\\Assessment 2nd\\test1.docx");

        paragraphList = docx.getParagraphs();

        System.out.println("******************** Second list Starts here  ******************** ");
        System.out.println();
        for (int i = 0; i < paragraphList.size() - 1; i++) {

            secondList.add(paragraphList.get(i).getText().toString());

            System.out.println(secondList.get(i).toString());

        }

        System.out.println("*********** Second list Ends here ********************");

    }

    public static void main(String[] args) {

        get_First_Doc_Data();

        get_Second_Doc_Data();

        //System.out.println("First Para: " + firstList.contains(secondList));

        compare();

        compare_Two_List();

        }

    private static void compare() {
        String firstMiss = null;
        //String secondMiss = null;

        for (int i = 0; i < firstList.size(); i++) {

            for (int j = 0; j < secondList.size(); j++) {

                if (!firstList.get(i).toString().equals(secondList.get(i).toString())) {

                    firstMiss = firstList.get(i).toString();

                    //secondMiss = secondList.get(i).toString();

                    map = new HashMap<String, String>();

                }
            }

            firstMissedArray.add(firstMiss);
            //secondMissedArray.add(secondMiss);

            // System.out.println(missedArray.get(i).toString());

        }

    }

    private static void compare_Two_List() {

        int num = 0;
        map.clear();

        Iterator<String> first = firstMissedArray.iterator();
        //Iterator<String> second = secondMissedArray.iterator();

        while (first.hasNext()) {
            
            map.put(""+num, first.next());
            
            num++;
            
        }

        System.out.println(firstMissedArray.size());

        Iterator it = map.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry pair = (Map.Entry) it.next();
            System.out.println(pair.getKey() + " = " + pair.getValue());
            // it.remove(); // avoids a ConcurrentModificationException
        }

    }
}

1 Ответ

0 голосов
/ 09 августа

Я позволил себе изменить ваш код, чтобы найти решение вашей проблемы. Пожалуйста go через это. Это должно в значительной степени решить вашу проблему - поместите операторы SYSO везде, где вы считаете нужным, и настройте поток программы для достижения желаемых проверок в соответствии с вашими требованиями. В спешке я, возможно, не использовал стандарты кодирования для использования блока try catch для обработки ошибок и обработки отрицательного сценария ios, поэтому, пожалуйста, позаботьтесь об этом при реализации в реальном времени.

В случае, если документы не являются .DOCX, но .PDF используют Apache PDFBox api.

Вот код:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;

import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;

public class Comapre_Docs {
    private static final String FIRST_DOC_PATH = "E:\\Workspace_Luna\\assignments\\Expected.docx";
    private static final String SECOND_DOC_PATH = "E:\\Workspace_Luna\\assignments\\Actual.docx";
    private static XWPFDocument docx;
    private static List<XWPFParagraph> paragraphList;
    private static ArrayList<String> firstList = new ArrayList<String>();
    private static ArrayList<String> secondList = new ArrayList<String>();

    public static void get_Doc_Data(String filePath, ArrayList listName)
            throws IOException {
        File file = new File(filePath);
        FileInputStream fis = new FileInputStream(file);
        docx = new XWPFDocument(fis);

        paragraphList = docx.getParagraphs();

        for (int i = 0; i <= paragraphList.size() - 1; i++) {
            listName.add(paragraphList.get(i).getText().toString());
        }
        fis.close();
    }

    public static void main(String[] args) throws IOException {
        get_Doc_Data(FIRST_DOC_PATH, firstList);
        get_Doc_Data(SECOND_DOC_PATH, secondList);
        compare(firstList, secondList);
    }

    private static void compare(ArrayList<String> firstList_1,
            ArrayList<String> secondList_1) {
        simpleCheck(firstList_1, secondList_1);
        int size = firstList_1.size();
        for (int i = 0; i < size; i++) {
            paragraphCheck(firstList_1.get(i).toString().split(" "),
                    secondList_1.get(i).toString().split(" "), i);
        }
    }

    private static void paragraphCheck(String[] firstParaArray,
            String[] secondParaArray, int paraNumber) {
        System.out
                .println("=============================================================");
        System.out.println("Paragraph No." + (paraNumber + 1) + ": Started");
        if (firstParaArray.length != secondParaArray.length) {
            System.out.println("There is mismatch of "
                    + Math.abs(firstParaArray.length - secondParaArray.length)
                    + " words in this paragraph");
        }
        TreeMap<String, Integer> firstDocPara = getOccurence(firstParaArray);
        TreeMap<String, Integer> secondDocPara = getOccurence(secondParaArray);
        ArrayList<String> keyData = new ArrayList<String>(firstDocPara.keySet());
        for (int i = 0; i < keyData.size(); i++) {
            if (firstDocPara.get(keyData.get(i)) != secondDocPara.get(keyData
                    .get(i))) {
                System.out
                        .println("The following word is missing in actual document : "
                                + keyData.get(i));
            }
        }
        System.out.println("Paragraph No." + (paraNumber + 1) + ": Done");
        System.out
                .println("=============================================================");
    }

    private static TreeMap<String, Integer> getOccurence(String[] paraArray) {
        TreeMap<String, Integer> paragraphStringCountHolder = new TreeMap<String, Integer>();
        paragraphStringCountHolder.clear();
        for (String a : paraArray) {
            int count = 1;
            if (paragraphStringCountHolder.containsKey(a)) {
                count = paragraphStringCountHolder.get(a) + 1;
                paragraphStringCountHolder.put(a, count);
            } else {
                paragraphStringCountHolder.put(a, count);
            }
        }
        return paragraphStringCountHolder;
    }

    private static boolean simpleCheck(ArrayList<String> firstList,
            ArrayList<String> secondList) {
        boolean flag = false;
        if (firstList.size() > secondList.size()) {
            System.out
                    .println("There are more paragraph in Expected document than in Actual document");
        } else if (firstList.size() < secondList.size()) {
            System.out
                    .println("There are more paragraph in Actual document than in Expected document");
        } else if (firstList.size() == secondList.size()) {
            System.out.println("The paragraph count in both documents match");
            flag = true;
        }
        return flag;
    }

}
...