2010-04-30 10 views
17

मैं लाखों नामों को एक-बार बैच प्रक्रिया में, उनके वर्तमान अपरकेस फ़ॉर्म से उचित मिश्रित मामले में बदलने के लिए एक मूल कार्य लिख रहा हूं। मैं निम्नलिखित समारोह के साथ आया था:नाम को उचित मामले में बदलने के लिए यह तरीका कैसे सुधार सकता है?

public string ConvertToProperNameCase(string input) 
{ 
    char[] chars = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(input.ToLower()).ToCharArray(); 

    for (int i = 0; i + 1 < chars.Length; i++) 
    { 
     if ((chars[i].Equals('\'')) || 
      (chars[i].Equals('-'))) 
     {      
      chars[i + 1] = Char.ToUpper(chars[i + 1]); 
     } 
    } 
    return new string(chars); 
} 

यह इस तरह के रूप ज्यादातर मामलों में काम करता है:

  1. जॉन स्मिथ → जॉन स्मिथ
  2. स्मिथ, जॉन टी → स्मिथ, जॉन टी
  3. जॉन O'BRIAN → जॉन ओ'ब्रायन
  4. जॉन डो-स्मिथ → जॉन डो-स्मिथ
    1. जेसन मैकडोनाल्ड → जेसन मैकडोनाल्ड (सही: जेसन मैकडॉनल्ड्स)
    2. ऑस्कर डी ला होया → ऑस्कर डी ला होया (सही: ऑस्कर डे ला होया

    कुछ बढ़त मामलों जो काम नहीं करते हैं)

  5. MARIE DiFranco → मारी DiFranco (सही: मैरी DiFranco)

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

+0

कुछ हद तक मामूली विस्तार, लेकिन FxCop आपको 'इनपुट के बारे में चेतावनी देना चाहिए। कम करने वाला()'; आपको वहां उपयोग करने के लिए संस्कृति निर्दिष्ट करनी चाहिए। मुझे यकीन नहीं है कि यह 'Char.ToUpper' पर भी लागू होता है। –

+0

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

+1

@ नेल्सन लेकिन जब आपके पास कोई नियंत्रण नहीं है, तो आपके पास डेटा कहां से आया है :( – Kelsey

उत्तर

9

मुझे लगता है कि आप फिर से एक दीवार चलाएंगे क्योंकि आम तौर पर यदि आप रूपांतरण उचित हैं या नहीं तो आप सही तरीके से न्याय नहीं कर पाएंगे।

अपने किनारे मामलों पर विचार करें

जेसन मैकडोनाल्ड -> जेसन मैकडोनाल्ड (सही: जेसन मैकडॉनल्ड्स)

आप बस आपके नाम की शुरुआत में Mc के लिए जांच कर सकता है और उसके बाद अपने सुधार लागू , सही? लेकिन क्या होगा अगर आपके व्यक्ति का नाम Mcizck रखा गया है (मैंने इसे निश्चित रूप से बनाया है) और इसे मैक इज़क में सही नहीं किया जाना चाहिए, लेकिन इसे छोड़ दिया जाना चाहिए?

इस समस्या का कोई 100% सही समाधान नहीं है। आपके पास यहां एक प्राकृतिक भाषा समस्या है, और विशेष रूप से कंप्यूटर के लिए हल करना वास्तव में मुश्किल है। सही ढंग से मॉडलिंग के लिए संस्कृति बहुत अलग हैं। यहां तक ​​कि यदि आप कहते हैं कि उत्तर-अमेरिकी सम्मेलन प्राथमिकता लेते हैं तो आपके पास "झूठी सकारात्मक" का उच्च प्रतिशत होगा। हमारे समाज में संस्कृतियों का एक बड़ा मिश्रण शामिल है, यह कहना पर्याप्त नहीं है कि "उत्तर-अमेरिकी प्राथमिकता लेता है"।

किनारे के मामलों को संभालने के बिना, मुझे लगता है कि आपका वर्तमान समाधान 99% समय पर काम करेगा। 100% सही नामों की वास्तव में आवश्यकता होने पर सभी आगे बढ़ने वाले मामलों को मैन्युअल रूप से सही किया जाना चाहिए।

0

सबसे पहले, यह कोड अपवाद फेंक देगा यदि नाम में 'या - अंत में है क्योंकि यह सरणी में अगले (अस्तित्वहीन) तत्व को कैपिटल करने का प्रयास करेगा। संपादित करें, नीचे

उसके अलावा टिप्पणी देखें ...

मुझे नहीं लगता कि तुम सच में DiFranco के लिए खाते में कर सकते हैं जब तक आप केवल DiFranco के लिए खाते और कोई अन्य Di की (हैं वहाँ कोई?)। साथ ही, मुझे लगता है कि यह मानना ​​सुरक्षित है कि किसी भी मैक को अगले पत्र की राजधानी का हकदार है। और मुझे यह भी लगता है कि यह कहना सुरक्षित है कि डी और ला जब उनके चारों ओर की जगह कम हो सकती है।

लेकिन दिन के अंत में, आप संस्कृतियों का उपयोग करने की कोशिश कर रहे हैं जो मुझे इंगित करता है कि शायद आप केवल अंग्रेज़ी का उपयोग नहीं कर रहे हैं। यदि ऐसा है तो मुझे लगता है कि आपको लगता है कि आप की तुलना में कई और समस्याएं हैं। आप केवल अंग्रेजी कर रही हैं कर रहे हैं (या इस मॉड्यूल अंग्रेजी मॉड्यूल है और वहाँ अन्य भाषाओं के लिए दूसरों रहे हैं), तो शायद आप के रूप में करीब हैं के रूप में आप (अलग Mc आदि से) प्राप्त करने के लिए

+0

डिबेला एक और 'डी' है (हाई स्कूल से उस उपनाम के साथ एक लड़की की यादें यादें ;-)) – DaveDev

+1

@statichippo मुझे नहीं लगता कि यह एक अपवाद (केवल इसका परीक्षण करेगा), लूप केस 'i + 1 <अक्षर। लम्बाई 'तो यह हमेशा अंत से 1 वर्ण वापस रहेगा। – Kelsey

+0

woops, यह ध्यान नहीं दिया। संपादित – hackerhasid

0

आप कर सकते थे जा रहे हैं अपने सीमांकक "", "", और "पर

  • स्प्लिट -"
  • शीर्षक केस प्रत्येक भाग
  • प्रत्येक वाक्यांश
3

के लिए अपने सभी किनारे मामलों संभाल का कोई सामान्य समाधान नहीं है यह समस्या। यहां तक ​​कि "Mc" की तरह सामान्य बढ़त मामलों के भीतर, वहाँ काउंटर उदाहरण हैं। मेरे पास कॉलेज में एक दोस्त "मैक" नाम था जिसने निम्नलिखित चरित्र को पूंजीकृत नहीं किया था; जाहिरा तौर पर यह पहले आव्रजन पीढ़ियों में बँधा हुआ था और वे सब ऑन-रिकॉर्ड में अभी तक ऐतिहासिक-गलत वर्तनी के साथ चिपके रहते हैं।

अपने साथी की पहली नामों में से एक दो पारंपरिक पहले एक साथ CamelCased नाम है। आप इसके लिए कभी भी खाते में सक्षम नहीं होने जा रहे हैं।

यह समस्या वीडियो फ़ाइल को अपस्केल करने के बराबर है; आप सबसे अच्छे अनुमान लगा सकते हैं लेकिन आप जादुई रूप से उस जानकारी को उत्पन्न नहीं कर सकते जो पहले स्थान पर संग्रहीत नहीं था।

+3

आपका मतलब है कि आप टीवी पर कम गुणवत्ता वाली छवि में स्वचालित रूप से "बढ़ाना" और "ज़ूम" 100x नहीं कर सकते हैं? –

1

आप ऐसे नियम बना सकते हैं जो आपको करीब ले सकें, लेकिन आपको 100% नहीं मिल सकता है। उदाहरण के लिए, आप उपसर्ग (मैक, डी, इत्यादि) की एक सूची बना सकते हैं

  1. यदि उपसर्ग एक स्वर में समाप्त होता है और अगला अक्षर एक स्वर, लोअरकेस है।
  2. यदि उपसर्ग एक स्वर में समाप्त होता है और अगला अक्षर एक व्यंजन, अपरकेस होता है।
  3. यदि उपसर्ग एक व्यंजन में समाप्त होता है, तो अगला अक्षर अपरकेस होता है।

आदि ... लेकिन आप शायद उपसर्गों की एक अच्छी सूची प्राप्त करना चाहते हैं और आपके पास हमेशा अपवाद होंगे।

0

समस्या यह है कि, जैसा कि हर किसी ने कहा था कि आप कभी भी हर किनारे के मामले को पकड़ने वाले नहीं हैं। मैं here पर जाने का सुझाव देने जा रहा था, पूर्ण डेटा सेट डाउनलोड और तुलना कर रहा था। लेकिन, वह डेटा सेट सभी ऊपरी-आधारित है। चूंकि यह एक बार की प्रक्रिया है, इसके बजाय, मैं उपर्युक्त लिंक से सूची डाउनलोड करूंगा जिसमें शीर्ष 1000 उपनाम हैं, मैन्युअल रूप से उन्हें सही करें और उस सूची के विरुद्ध अपने रिकॉर्ड को संसाधित करें। फ्लैग उन रिकॉर्ड के संसाधन और यदि संख्या काफी छोटा हाथ से प्रबंधनीय हो रहा है देख नहीं।

0

आपका प्रश्न इस बात के बारे में है कि आपके प्रोग्राम में सुधार किया जा सकता है या नहीं। मेरी प्रतिक्रिया है, "किस दिशा में सुधार है?" आपके पास दो अलग-अलग किनारे के मामले हैं जो पारस्परिक रूप से अनन्य हैं।या तो आप असामान्य पूंजीकरण नियमों वाले लोगों को नहीं पकड़ेंगे, या आप उन लोगों को नहीं पकड़ेंगे जो असामान्य पूंजीकरण नियमों का पालन नहीं करते हैं।

मैं "डी ला रोसा" के उपनाम वाले किसी के साथ स्कूल गया था। डे ला होया के अपने उदाहरण को ध्यान में रखते हुए, यह मानना ​​उचित होगा कि "डी ला रोसा" भी वहां किसी का उपनाम है। तो यदि आप "डे ला" को क्षीण करने के लिए एक विधि लागू करते हैं, तो आप मेरे दोस्त को याद करते हैं और मैं दुखी होगा। और यदि आप decapitalization लागू नहीं करते हैं, तो आप उन अन्य लोगों को याद करते हैं। और स्वर्ग आपको कुछ डी ला रोसा में भागने से मना करता है जो किसी भी विधि से पकड़ा नहीं जाएगा ...

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

4

मुझे उम्मीद है कि आप इस रूपांतरण को कर रहे हैं क्योंकि सॉफ्टवेयर बदल रहा है ताकि उपयोगकर्ता अपने नाम सही जगह पर सही आवरण के साथ इनपुट कर सकें।

उस ने कहा, केवल भरोसेमंद समाधान उपयोगकर्ताओं को सूचित करना होगा कि आपने उनके नाम का प्रतिनिधित्व बदल दिया है। यदि वे गलत हैं तो वे आवरण को संपादित कर सकते हैं। (आप उन्हें कॉल कर सकते हैं, उन्हें ईमेल कर सकते हैं, अगली बार अपने सॉफ्टवेयर का उपयोग करने तक प्रतीक्षा करें)

यदि आप उपयोगकर्ताओं को अपना नाम अपडेट नहीं कर सकते हैं, तो दूसरा सबसे भरोसेमंद तरीका सूचियों को एकत्र करना होगा (अंतिम) सार्वजनिक स्रोतों से नाम। यदि आप इनमें से पर्याप्त पा सकते हैं, तो आप किनारे के मामलों को अधिक कवर करने में सक्षम होना चाहिए - बस देखें कि नाम आपकी उचित-कैस्ड सूची में मौजूद है या नहीं, फिर उस आवरण का उपयोग करें।

+1

यह एक सिस्टम डेटा माइग्रेशन है जहां 'ग्राहकों के पास पुराने या नए में इस डेटा तक कोई पहुंच नहीं है। नई प्रणाली में आयात करने से पहले डेटा का बैच साफ़ करें। – Kelsey

+1

+1 महत्वपूर्ण बात यह है कि हमें ग्राहक की इच्छाओं का सम्मान करना चाहिए कि उनके नाम किस प्रकार वर्तनी या पूंजीकृत हैं। –

+1

यदि यह बैच क्लीनअप होने का मतलब है, तो आपको मामला बिल्कुल बदलना नहीं चाहिए। सभी मामलों में सभी कैप्स का तात्पर्य है कि मामले की जानकारी ज्ञात नहीं है।प्रासंगिक रूप से पूंजीकरण का परिचय देना वास्तव में आपके डेटा को गंदगी देता है, क्योंकि आप 0% पूंजीकरण त्रुटियों से 0% पूंजीकरण त्रुटियों में जाते हैं। –

0
<System.Runtime.CompilerServices.Extension()> _ 
Public Function ProperCase(ByVal value As String) As String 

    If String.IsNullOrWhiteSpace(value) Then 
     Return String.Empty 
    End If 

    value = value.Trim 

    Dim sb As New StringBuilder(CultureInfo.CurrentCulture.TextInfo.ToTitleCase(value.ToLower)) 

    '// Special cases ' and - 
    For i As Integer = 0 To sb.Length 
     Dim c As Char = sb(i) 
     If sb(i).Equals("'") Or sb(i).Equals("-") Then 
      'Upper Case Next character 
      sb(i + 1) = Char.ToUpper(sb(i + 1)) 
     End If 
    Next 

    If sb.ToString.StartsWith("Mac") Then 
     sb(3) = Char.ToUpper(sb(3)) 
    End If 

    If sb.ToString.StartsWith("Mc") Then 
     sb(2) = Char.ToUpper(sb(2)) 
    End If 

    Return sb.ToString 

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