เปรียบเทียบเอกสารสองชุดใน Java

Oct 16 2020

ฉันมีเอกสารคำสองคำที่ฉันพยายามเปรียบเทียบใน java ฉันลองใช้

แฮชโค้ด md5

HashCode newFile = Files.asByteSource(newFileInput).hash(Hashing.md5());
HashCode oldFile = Files.asByteSource(oldFileInput).hash(Hashing.md5());

และยังใช้

บูลีน isEqual = FileUtils.contentEquals (oldFile, newFile);

แม้ว่าเนื้อหาจะเหมือนกัน แต่เมื่อเปรียบเทียบกับเนื้อหาโดยใช้เครื่องมือออนไลน์และนอกเหนือจากการเปรียบเทียบแล้วก็ยังคงแฮชโค้ดในทั้งสองวิธีข้างต้นเป็น MISMATCH

วิธีแก้ปัญหาใด ๆ หรือวิธีเปรียบเทียบไฟล์ประเภทใดก็ได้โดยใช้ API ใด ๆ ใน Java ฉันต้องทำการเปรียบเทียบอย่างลึกซึ้งระหว่างไฟล์ word สองไฟล์เช่นเดียวกับช่องว่างแบบอักษรเนื้อหา ฯลฯ ..

ผลลัพธ์ที่คาดหวัง: ทั้งสองไฟล์ควรตรงกัน

คำตอบ

2 Milgo Oct 16 2020 at 12:41

แม้ว่าเอกสารทั้งสองของคุณจะมีลักษณะเหมือนกันหรือแม้ว่าทั้งสองจะมีเนื้อหาที่มีรูปแบบเหมือนกัน แต่การเปลี่ยนแปลงเล็กน้อยเช่นวันที่แก้ไขล่าสุดจะทำให้การเปรียบเทียบล้มเหลว เอกสาร JSON เปรียบเทียบได้ง่ายกว่า แต่เอกสาร Word เป็นไบนารี การเปลี่ยนแปลงที่เล็กที่สุดสามารถเปลี่ยนแปลงเอกสารได้อย่างสมบูรณ์

ดังนั้นคุณต้องทำวิธีที่ยาก: ค้นหาห้องสมุดเพื่ออ่านเนื้อหาของไฟล์ Word ด้วยตัวเองและตรวจสอบเนื้อหาของทั้งสองไฟล์โดยเฉพาะ

backToStack Oct 21 2020 at 16:38

มีคำแนะนำและคำตอบมากมายสำหรับคำถามของฉันขอบคุณสำหรับสิ่งนั้น สาเหตุของการไม่ตรงกันในไฟล์ docx มีอยู่ในข้อมูลเมตาทุกครั้งที่เราสร้างไฟล์ doc / docx การประทับเวลาจะเปลี่ยนไป แม้ว่าฉันจะพยายามเปลี่ยนการประทับเวลา (เข้าถึงแก้ไขและสร้าง) ของทั้งสองไฟล์เพื่อให้เหมือนกันและเปรียบเทียบซึ่งไม่ได้ผล เหตุผลนอกเหนือจากการประทับเวลาเหล่านี้ยังมีข้อมูลเมตาที่เรียกว่า Zip Modify Date ซึ่งมองไม่เห็นเมื่อเราเห็นคุณสมบัติของไฟล์ การประทับเวลานี้ฉันพบว่าเป็นสาเหตุหนึ่งที่มีแฮชโค้ดไม่ตรงกัน นอกจากนี้สตริงที่เข้ารหัส base64 ยังแตกต่างกันเนื่องจากการประทับเวลา zip

ดังนั้นตัวเลือกที่ฉันต้องทำการเปรียบเทียบคือ:

1. converting the docx file to xml file
2. Zip the docx file, unzip it and iterate though all the xml files to find  the hashcode and compare the hascodes.(suggeted as of the answers)

"2" เป็นสิ่งที่ดี แต่ต้องมีการทำซ้ำหลายครั้งและการคลายซิปจะสร้างโฟลเดอร์จำนวนมาก

"1" เป็น fwd ตรงเนื่องจากฉันลองใช้ lib ภายนอก -> docx4j ซึ่งแปลง docx เป็น xml จากนั้นฉันสามารถจับคู่แฮชโค้ดได้มันใช้งานได้

แปลง DOCX เป็นไฟล์ XML

ฉันต้องลองใช้ตัวเลือกต่างๆเนื่องจากฉันกำลังมองหาวิธีที่ง่ายและไม่ซับซ้อนในการเปรียบเทียบเนื้อหาและรูปแบบของเอกสารคำ