2009-12-19 17 views
17

मैं टेक्स्ट के दो ब्लॉक के बीच अंतर दिखाना चाहता हूं। पाठ या व्यक्तिगत पात्रों की रेखाओं की तुलना करने के बजाय, मैं केवल निर्दिष्ट वर्णों ('\ n', '', '\ t' उदाहरण के लिए अलग शब्दों की तुलना करना चाहता हूं)। इसके लिए मेरा मुख्य तर्क यह है कि टेक्स्ट की ब्लॉक जो मैं तुलना करूँगा आम तौर पर इसमें कई लाइन ब्रेक नहीं होते हैं और अक्षर तुलना का पालन करना मुश्किल हो सकता है।सी # का उपयोग करके शब्द अंतर कैसे प्रदर्शित करें?

मैं लाइनों और पात्रों की तुलना करने के लिए निम्नलिखित O(ND) logic in C# पर आया हूं, लेकिन शब्दों की तुलना करने के लिए इसे संशोधित करने के तरीके के बारे में मुझे नुकसान हुआ है।

इसके अतिरिक्त, मैं शब्दों के बीच विभाजकों का ट्रैक रखना चाहता हूं और यह सुनिश्चित करना चाहता हूं कि वे diff के साथ शामिल हैं। तो यदि एक जगह को एक हार्ड रिटर्न द्वारा प्रतिस्थापित किया जाता है, तो मैं इसे एक diff के रूप में आने के लिए चाहूंगा।

मैं हटाए गए मूल पाठ सहित टेक्स्ट के पूरे ब्लॉक को प्रदर्शित करने के लिए Asp.Net (C#) का उपयोग कर रहा हूं और नया टेक्स्ट जोड़ा गया है (दोनों को यह दिखाने के लिए हाइलाइट किया जाएगा कि वे हटाए गए/जोड़े गए हैं)। एक समाधान जो उन प्रौद्योगिकियों के साथ काम करता है उसकी सराहना की जाएगी।

इसे पूरा करने के लिए कोई सलाह की सराहना की जाती है।

+0

मज़े करें। मेरे प्रमुख उत्पाद लाइन की रिहाई के लिए मेरा एक सहकर्मी ऐसा करने के लिए किया गया। उसे पर्याप्त रूप से चुनौती दी गई थी।और उन्होंने अपने काम को मार्गदर्शन करने के लिए कई सिद्धांत पत्रों का उपयोग किया ... लेखन की गुणवत्ता के बारे में पूरे समय पकड़ना। –

उत्तर

15

माइक्रोसॉफ्ट CodePlex पर एक diff परियोजना है कि आप शब्द, चरित्र, और लाइन डिफ करने की अनुमति देता जारी किया है। इसे माइक्रोसॉफ्ट पब्लिक लाइसेंस (एमएस-पीएल) के तहत लाइसेंस प्राप्त है।

https://github.com/mmanela/diffplex

+2

डिफप्लेक्स आपको टेक्स्ट को विभाजित करने से पहले एक कस्टम फ़ंक्शन को परिभाषित करने देता है। DiffResult CreateCustomDiffs (स्ट्रिंग oldText, स्ट्रिंग newText, bool ignoreWhiteSpace, Func <स्ट्रिंग, स्ट्रिंग []> chunker) जहां chunker DiffPlex एक दूसरे के खिलाफ तुलना करने के लिए परमाणु इकाइयां हैं क्या कहता है: आप विधि का उपयोग कर सकते हैं। –

+0

हाय जिम, मैं इसी तरह के समाधान की तलाश में हूं, यदि आपकी समस्या हल हो गई है तो diffplex का उपयोग करते हुए अपने विचार को जानना चाहते थे? –

+0

ऐसा लगता है कि मैंने अपने समाधान के लिए http://www.codeproject.com/Articles/11454/A-word-wise-HTML-text-compare-and-merge-engine का उपयोग किया था। मुझे याद नहीं है कि मैंने इसे diffplex, tbh पर क्यों इस्तेमाल किया। यह समाधान परिभाषित एचटीएमएल टैग में हटाए गए और जोड़े गए शब्दों को लपेटता है, जो आपको इच्छित शैली के रूप में अनुमति देता है। –

1

कुछ सामान्य अनुकूलन के अलावा, यदि आपको तुलना में विभाजक शामिल करने की आवश्यकता है तो आप अनिवार्य रूप से ब्रेक के साथ चरित्र तुलना द्वारा एक चरित्र कर रहे हैं। यद्यपि आप लिंक किए गए ओ (एनडी) का उपयोग कर सकते हैं, लेकिन आप मूल रूप से अपना लिखने के रूप में इसमें कई बदलाव करने जा रहे हैं।

अंतर तुलना के साथ मुख्य समस्या निरंतरता ढूंढ रही है (यदि मैं एक शब्द हटा देता हूं, लेकिन बाकी को छोड़ देता हूं)।

आप उदाहरण के साथ अपने कोड शुरू उपयोग करना चाहते हैं और अगर वहाँ एक ही स्थान पर वर्ण बदल दिया जाता है, नष्ट कर दिया वर्ण लिखने नहीं है, तो उत्पादन इस परिणाम नहीं है। इसके बाद आपको "परिवर्तित" शब्दों के सबसे लंबे समय तक चलने की गणना करने की आवश्यकता है, इस स्ट्रिंग और आउटपुट को हाइलाइट करें।

क्षमा करें कि कोई जवाब नहीं है, लेकिन इस समस्या के लिए उत्तर मूल रूप से कार्य लिख रहा है और ट्यूनिंग कर रहा है।

0

अच्छी तरह से String.Split '\ n', '' और '\ t' के साथ विभाजित वर्ण आपको टेक्स्ट के ब्लॉक में शब्दों की एक सरणी वापस कर देगा।

आप अंतर के लिए प्रत्येक सरणी की तुलना कर सकते हैं। एक साधारण 1: 1 तुलना आपको बताएगी कि क्या कोई शब्द बदल दिया गया है। तुलना:

hello world how are you 

और:

hello there how are you 

आप देना होगा कि world और there को बदल दिया है।

यह क्या बता नहीं होगा अगर शब्द डाला गया था या हटा दिया और आप अभी भी चरित्र द्वारा पाठ ब्लॉक चरित्र पार्स करने के लिए करता है, तो विभाजक वर्णों के किसी भी बदल दिया गया था देखने के लिए की आवश्यकता होगी आप था।

+1

मुझे डर है कि स्ट्रिंग। टेक्स्ट के बड़े ब्लॉक के लिए स्प्लिट अक्षम होगा। –

संबंधित मुद्दे