क्या सेल में विशेष वर्णों की पहचान करने के लिए एक्सेल फॉर्मूला है?


13

हमारे पास लगभग 3500 दस्तावेज हैं जिनके विशेष नाम को कोष्ठक, कॉलन, अर्धविराम, अल्पविराम, आदि को हटाने के लिए मैन्युअल रूप से छानने की आवश्यकता है।

मेरे पास एक पाठ फ़ाइल है जिसे मैंने एक्सेल में डंप किया है, और मैं एक स्तंभ बनाने की कोशिश कर रहा हूं जो संशोधन के लिए फ़ाइल नाम को चिह्नित करता है यदि इसमें विशेष वर्ण शामिल हैं। छद्मकोश सूत्र होगा

=IF (cellname contains [^a-zA-z_-0-9], then "1", else "0")

पंक्ति को चिह्नित करने के लिए यदि इसमें AZ, 0-9, - या _ के अलावा कोई भी वर्ण है, चाहे मामला हो।

किसी को कुछ है कि मेरे लिए काम कर सकते हैं का पता है? मैं कोड और बड़े पैमाने पर ifबयान से संकोच कर रहा हूँ अगर वहाँ कुछ जल्दी और आसानी से है।


क्या कोई विशेष कारण है कि आप एक्सेल में इस टेक्स्ट प्रोसेसिंग कार्य को कर रहे हैं? यहां तक ​​कि स्वयं को Microsoft Office उपकरणों तक सीमित करना, यह एक काफी सरल खोज है और वर्ड में प्रतिस्थापित है। दो कॉलम, मूल फ़ाइल नाम और संसाधित फ़ाइल नाम के साथ तालिका।
mpez0

ये एक 3rd पार्टी सॉफ्टवेयर से इंडेक्स एंट्रीज हैं। यह सॉफ्टवेयर उन फिल्नामों का उत्पादन करता है जिनमें कॉलन, ब्रैकेट, एम्परसेंड आदि शामिल हैं, जो रूपांतरण कार्यक्रमों में अपवाद पैदा करते हैं। हमें कनवर्ट करने से पहले तीसरे पक्ष के सॉफ़्टवेयर में डेटा को साफ़ करना होगा; विक्रेता उस कार्य को स्वचालित करने के लिए एक एपीआई प्रदान नहीं करता है। मेरे पास एक टेक्स्ट फ़ाइल में फ़ाइल नाम की एक सूची है। मैं फ़ाइल नाम में विशेष वर्णों की उपस्थिति के आधार पर एक ध्वज बनाने के लिए एक्सेल का उपयोग कर रहा हूं। पॉवर्सशेल, सी # और जावा गलत परिणाम देते हैं क्योंकि विशेष वर्णों को ऑपरेटरों के रूप में व्याख्या की जाती है।
dwwilson66

1
मैं इंगित करना चाहता हूं कि आप शायद इसके लिए गलत टूल का उपयोग कर रहे हैं। मैं उदाहरण के लिए नोटपैड ++ में यह बहुत जल्दी करने के कुछ तरीकों के बारे में सोच सकता हूं। आप अंत में एक्सेल में परिणाम आयात कर सकते हैं और 1s और 0s का एक कॉलम रख सकते हैं।
डेन

@ एनपी ++ के बारे में जानने के लिए अच्छा है। मुझे उसका पता लगाना होगा। मेरे पास उपकरण स्थापित है, लेकिन इसके साथ बहुत अनुभव नहीं है। पारितोषिक के लिए धन्यवाद।
dwwilson66 17

जवाबों:


19

कोई कोड नहीं? लेकिन यह इतना छोटा और आसान और सुंदर है और ... :(

आपके RegEx पैटर्न [^A-Za-z0-9_-]का उपयोग सभी कोशिकाओं में सभी विशेष वर्णों को निकालने के लिए किया जाता है।

Sub RegExReplace()

    Dim RegEx As Object
    Set RegEx = CreateObject("VBScript.RegExp")
    RegEx.Global = True

    RegEx.Pattern = "[^A-Za-z0-9_-]"
    For Each objCell In ActiveSheet.UsedRange.Cells
        objCell.Value = RegEx.Replace(objCell.Value, "")
    Next

End Sub

संपादित करें

यह उतना ही निकट है जितना मैं आपके मूल प्रश्न पर पहुँच सकता हूँ।

यहाँ छवि विवरण दर्ज करें

दूसरा कोड =RegExCheck(A1,"[^A-Za-z0-9_-]")2 तर्कों के साथ एक उपयोगकर्ता-परिभाषित फ़ंक्शन है। पहली जांच करने के लिए सेल है। दूसरी जांच के लिए RegEx पैटर्न है। यदि पैटर्न आपके सेल के किसी भी अक्षर से मेल खाता है, तो यह 1 अन्यथा 0 पर लौटेगा।

यदि आप पहली बार VBA संपादक को ALT+ के साथ खोलते हैं F11, तो एक नया मॉड्यूल (!) डालें और नीचे दिए गए कोड को पेस्ट करें।

Function RegExCheck(objCell As Range, strPattern As String)

    Dim RegEx As Object
    Set RegEx = CreateObject("VBScript.RegExp")
    RegEx.Global = True
    RegEx.Pattern = strPattern

    If RegEx.Replace(objCell.Value, "") = objCell.Value Then
        RegExCheck = 0
    Else
        RegExCheck = 1
    End If

End Function

RegEx में नए उपयोगकर्ताओं के लिए मैं आपके पैटर्न की व्याख्या करूँगा: [^A-Za-z0-9_-]

[] stands for a group of expressions
^ is a logical NOT
[^ ] Combine them to get a group of signs which should not be included
A-Z matches every character from A to Z (upper case)
a-z matches every character from a to z (lower case)
0-9 matches every digit
_ matches a _
- matches a - (This sign breaks your pattern if it's at the wrong position)

समस्या यह है कि मैं पात्रों को पुनः प्रकाशित नहीं करना चाहता, बस उन्हें सूची में ध्वजांकित करता हूं ताकि मैं इसे किसी और को सौंप सकूं। फ़ाइल नाम तृतीय-पक्ष सॉफ़्टवेयर द्वारा बनाए गए हैं और उस प्रोग्राम के भीतर मैन्युअल रूप से बदलने की आवश्यकता है ... मुझे बस हाँ या नहीं में फ़्लैग करने की आवश्यकता है। कहा जा रहा है, मुझे लगता है कि मैं कॉलम बदलने के लिए आपके बदले हुए कोड को संशोधित कर सकता हूं। :)
dwwilson66

इसे लागू करने के लिए ... यह सिर्फ एक नए मॉड्यूल में काटने और चिपकाने की बात है और बचत, सही है? या मुझे कुछ और करने की आवश्यकता है? सूत्र =RegExReplace(cell)पहचाना नहीं गया है .... और मैं नए कार्यों को बनाने में थोड़ा कठोर हूँ।
dwwilson66

@ dwwilson66 अपडेट किया गया!
निक्सदा

RegEx के अंदर हाइफ़न पर जोर देना (यदि यह गलत स्थिति पर है तो यह संकेत आपके पैटर्न को तोड़ देता है)
द रेड पीच

7

निक्सदा के कोड के समान कुछ का उपयोग करना, यहां एक उपयोगकर्ता परिभाषित फ़ंक्शन है जो सेल में विशेष वर्ण होने पर 1 वापस आ जाएगा।

Public Function IsSpecial(s As String) As Long
    Dim L As Long, LL As Long
    Dim sCh As String
    IsSpecial = 0
    For L = 1 To Len(s)
        sCh = Mid(s, L, 1)
        If sCh Like "[0-9a-zA-Z]" Or sCh = "_" Then
        Else
            IsSpecial = 1
            Exit Function
        End If
    Next L
End Function

उपयोगकर्ता परिभाषित कार्य (UDFs) स्थापित करने और उपयोग करने के लिए बहुत आसान हैं:

  1. ALT-F11 VBE विंडो लाता है
  2. ALT-I ALT-M एक नया मॉड्यूल खोलता है
  3. सामान पेस्ट करें और VBE विंडो बंद करें

यदि आप कार्यपुस्तिका सहेजते हैं, तो इसके साथ UDF सहेजा जाएगा। यदि आप बाद में 2003 के Excel के संस्करण का उपयोग कर रहे हैं, तो आपको .xlsx के बजाय .xlsm के रूप में फ़ाइल को सहेजना होगा

UDF को हटाने के लिए:

  1. ऊपर के रूप में VBE विंडो लाएं
  2. कोड साफ़ करें
  3. VBE विंडो बंद करें

Excel से UDF का उपयोग करने के लिए:

= IsSpecial (A1)

सामान्य रूप से मैक्रोज़ के बारे में अधिक जानने के लिए, देखें:

http://www.mvps.org/dmcritchie/excel/getstarted.htm

तथा

http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx

तथा

http://www.cpearson.com/excel/WritingFunctionsInVBA.aspx

यूडीएफ पर बारीकियों के लिए

इसके लिए मैक्रोज़ को सक्षम होना चाहिए !


आपने "_" को एक अलग या आइटम के रूप में क्यों इस्तेमाल किया? इसे उसी [] समूह में शामिल किया जा सकता है
jstuardo

@jstuardo केवल यह स्पष्ट करने के लिए कि अंडरस्कोर एक वैध चरित्र है।
गैरी स्टूडेंट

कोड को अपडेट नहीं किया जाना चाहिए If sCh Like "[0-9a-zA-Z ]" Or sCh = "_" Thenताकि मैक्रो मान ले कि रिक्त स्थान वैध वर्ण हैं?
Ovaryraptor

@Ovaryraptor आप सही हैं! मैं इसे कल अपडेट करूंगा।
गैरी की स्टूडेंट

2

यहां एक सशर्त प्रारूपण समाधान है जो विशेष वर्णों के साथ रिकॉर्डों को चिह्नित करेगा।

बस अपने डेटा के लिए एक नया सशर्त प्रारूपण नियम लागू करें, जो नीचे (बहुत लंबा) सूत्र का उपयोग करता है, जहां A1फ़ाइल नामों के कॉलम में पहला रिकॉर्ड है:

=SUMPRODUCT((CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<48)*(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<>45))+SUMPRODUCT((CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>57)*(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<65))+SUMPRODUCT((CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>90)*(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<97)*(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<>95))+SUMPRODUCT((CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>122)*1)

यह सूत्र प्रत्येक फ़ाइल नाम के प्रत्येक चरित्र की जाँच करता है और निर्धारित करता है कि इसका ASCII कोड स्वीकार्य वर्ण मानों के बाहर है या नहीं। दुर्भाग्य से, स्वीकार्य वर्ण कोड सभी संक्रामक नहीं हैं, इसलिए सूत्र को SUMPRODUCTs के sums का उपयोग करना पड़ता है । सूत्र खराब वर्णों की संख्या देता है। कोई भी कोशिका जो 0 से अधिक मान लौटाती है उसे ध्वजांकित किया जाता है।

उदाहरण: यहाँ छवि विवरण दर्ज करें


1

विशेष पात्रों को खोजने के लिए मैंने एक अलग दृष्टिकोण का उपयोग किया। मैंने प्रत्येक स्वीकृत वर्णों के लिए नए कॉलम बनाए, और फिर इस तरह के फॉर्मूले का उपयोग करके यह गिना कि प्रत्येक पंक्ति प्रविष्टि (Z2) में वर्ण कितनी बार अनुमत है:

AA2=LEN($Z2)-LEN(SUBSTITUTE($Z2,AA$1,""))
AB2=LEN($Z2)-LEN(SUBSTITUTE($Z2,AB$1,""))
...

फिर मैंने प्रत्येक पंक्ति में अनुमत वर्णों की संख्या को अभिव्यक्त किया, और फिर इसकी तुलना पंक्ति प्रविष्टि की कुल लंबाई से की।

BE2=LEN(Z2)
BF2=SUM(AA2:BC2)-BE2

और अंत में, मैंने नकारात्मक मूल्यों को खोजने के लिए अंतिम कॉलम (बीएफ 2) पर छंटनी की, जिसने मुझे उन कॉलमों के लिए प्रेरित किया जिन्हें सुधार की आवश्यकता थी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.