एक्सेल: एक स्ट्रिंग में अंतिम चरित्र / स्ट्रिंग मैच


187

क्या आधार कार्यों का उपयोग करके एक स्ट्रिंग में अंतिम चरित्र / स्ट्रिंग मैच की पहचान करने का एक कुशल तरीका है? यानी नहीं अंतिम वर्ण / स्ट्रिंग के स्ट्रिंग, लेकिन एक चरित्र / स्ट्रिंग के अंतिम घटना की स्थिति में एक स्ट्रिंग। Searchऔर findदोनों बाएं-से-दाएं काम करते हैं इसलिए मैं नहीं सोच सकता कि बिना लंबा पुनरावर्ती एल्गोरिदम कैसे लागू किया जाए। और यह समाधान अब अप्रचलित लगता है।


3
क्योंकि मैं उदाहरण के लिए अंतिम अवधि की स्थिति चाहता हूँ "।" स्ट्रिंग "one.two.three.four" में
15

6
यह देखते हुए कि कैसे एक गलत तरीके से पढ़ा गया सवाल वोटों को ऊपर
उठाता है

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

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

जवाबों:


1

एक्सेल के नए संस्करणों के साथ नए कार्य और नए तरीके आते हैं। हालाँकि यह पुराने संस्करणों में दुहराई जा सकती है (फिर भी मैंने इसे पहले नहीं देखा है), जब किसी के पास एक्सेल O365 हो तो वह उपयोग कर सकता है:

=MATCH(2,1/(MID(A1,SEQUENCE(LEN(A1)),1)="Y"))

इसका उपयोग (ओवरलैपिंग) सबस्ट्रिंग की अंतिम स्थिति को प्राप्त करने के लिए भी किया जा सकता है:

=MATCH(2,1/(MID(A1,SEQUENCE(LEN(A1)),2)="YY"))

| Value  | Pattern | Formula                                        | Position |
|--------|---------|------------------------------------------------|----------|
| XYYZ   | Y       | =MATCH(2,1/(MID(A2,SEQUENCE(LEN(A2)),1)="Y"))  | 3        |
| XYYYZ  | YY      | =MATCH(2,1/(MID(A3,SEQUENCE(LEN(A3)),2)="YY")) | 3        |
| XYYYYZ | YY      | =MATCH(2,1/(MID(A4,SEQUENCE(LEN(A4)),2)="YY")) | 4        |

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


नोट: आप पुराने Excel संस्करणों में समान व्यवहार को या तो के माध्यम से बाध्य कर सकते हैं

=MATCH(2,1/(MID(A2,ROW(A1:INDEX(A:A,LEN(A2))),1)="Y"))

अंतर्निहित चौराहे से छुटकारा पाने के लिए CtrlShiftEnterएक इनलाइन के माध्यम से प्रवेश किया , या INDEX:

=MATCH(2,INDEX(1/(MID(A2,ROW(A1:INDEX(A:A,LEN(A2))),1)="Y"),))

1
मैं इस inherits टिक अब लगता है, हालांकि पूर्ण ऐतिहासिक सम्मान @ tigeravatar की लम्बे समय से समाधान के हैं stackoverflow.com/a/18617720/1156245
geotheory

नोट: जब तक मेरा सुझाव स्केच कोड-गोल्फ में जीत जाएगा, बड़ी मात्रा में उपयोग किए जाने पर सरणियों का उपयोग हमेशा अनुशंसित नहीं होता है। हालाँकि, इसके अन्य लाभ भी हैं जिनका मैंने स्पष्ट उल्लेख करने का प्रयास किया है। यह @Tigeravatar द्वारा उत्तर को पहले जैसा ही प्रासंगिक बनाता है!
JvdV

345

मुझे लगता है कि मुझे वही मिलेगा जो आपका मतलब है। उदाहरण के लिए मान लें कि आप निम्नलिखित स्ट्रिंग में राइट-मोस्ट \ _ चाहते हैं (जो सेल A1 में संग्रहीत है):

ड्राइव: \ फ़ोल्डर \ सबफ़ोल्डर \ filename.ext

अंतिम \ की स्थिति प्राप्त करने के लिए, आप इस सूत्र का उपयोग करेंगे:

=FIND("@",SUBSTITUTE(A1,"\","@",(LEN(A1)-LEN(SUBSTITUTE(A1,"\","")))/LEN("\")))

जो हमें बताता है कि सही-सबसे \ _ चरित्र 24 पर है। यह "@" की तलाश करके और बहुत अंतिम "\" को "@" के साथ प्रतिस्थापित करता है। यह पिछले एक का उपयोग करके निर्धारित करता है

(len(string)-len(substitute(string, substring, "")))\len(substring)

इस परिदृश्य में, सबस्ट्रिंग बस "\" है जिसकी लंबाई 1 है, इसलिए आप विभाजन को अंत में छोड़ सकते हैं और बस:

=FIND("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))

अब हम फ़ोल्डर पथ प्राप्त करने के लिए इसका उपयोग कर सकते हैं:

=LEFT(A1,FIND("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\","")))))

यहाँ फ़ोल्डर पथ बिना अनुगामी \ _

=LEFT(A1,FIND("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))-1)

और सिर्फ नाम पाने के लिए:

=MID(A1,FIND("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))+1,LEN(A1))

हालांकि, यहां एक विशिष्ट चरित्र के अंतिम उदाहरण के दाईं ओर सब कुछ प्राप्त करने का एक वैकल्पिक संस्करण है। तो हमारे उसी उदाहरण का उपयोग करते हुए, यह फ़ाइल नाम भी लौटाएगा:

=TRIM(RIGHT(SUBSTITUTE(A1,"\",REPT(" ",LEN(A1))),LEN(A1)))

24
सिर घूम रहा; सिर का घूमना; सिर घूम रहा; "ठीक है - इसे समझे बिना इसका उपयोग नहीं करना है, इसलिए ... उह, ठीक है, उह हुह ... रुको! कौन? वास्तव में! यह प्रतिभा है! मुझे विश्वास है कि मुझे लगता है कि कई घंटों में नहीं सोचा होगा!" अगर दिन या सप्ताह नहीं! " - +1, दुख की बात है, क्योंकि +5 या +10 मेरे दम पर करना मुश्किल है --- अगर-यू-स्टिक-स्पष्टीकरण: (उदाहरण का उपयोग करके) SUBSTITUTEसभी (3) \कुछ भी नहीं के साथ उदाहरण (स्ट्रिंग की छोटी लंबाई) 3) -> कि \(3) अंतिम एक है; कि कुछ अद्वितीय और FINDउस अद्वितीय चरित्र की स्थिति के साथ बदलें ... बहुत बढ़िया ... धन्यवाद!
कोड जॉकी

7
यह चतुर है। बस इस बात से सावधान रहने की जरूरत है कि सेल में पहले से ही otherwise @ ’नहीं हैं अन्यथा आपको किसी और चीज के साथ सब-इन करना होगा। आप @ gwin003 द्वारा प्रस्तावित के रूप में=ISNUMBER(SEARCH("@",A1)) , का उपयोग कर जाँच कर सकते हैं ।
जियोथैरी

3
अंतिम घटना के अधिकार के लिए सब कुछ निकालने के लिए आपके अंतिम विकल्प की बहुत सराहना की जाती है, क्योंकि अधिकांश समय मैं "स्ट्रिंग वाई के भीतर स्ट्रिंग एक्स की अंतिम घटना" की तलाश में हूं, मेरा अंतिम लक्ष्य वास्तव में सब कुछ प्राप्त करना है उस अंतिम घटना का अधिकार।
SSilk

1
क्यों 99? क्या आप मान रहे हैं कि इन विभिन्न तारों की लंबाई 99 से कम है? इस उत्तर और इस उत्तर को देखें जो इस तरह की कोई धारणा नहीं बनाते हैं।
जीन-फ्रांकोइस कॉर्बेट

2
"@" के बजाय, मैंने CHAR (9) (टैब वर्ण) का उपयोग किया, क्योंकि मेरा डेटा मूल रूप से टैब-सीमांकित फ़ाइल से आता है, और मुझे गारंटी है कि यह मेरे डेटा में नहीं होगा।
जोशिया योदर

28

कैसे एक कस्टम फ़ंक्शन बनाने और अपने सूत्र में इसका उपयोग करने के बारे में? VBA में एक बिल्ट-इन फ़ंक्शन InStrRevहोता है, जो आपको वही दिख रहा है जो आप चाहते हैं।

इसे एक नए मॉड्यूल में रखें:

Function RSearch(str As String, find As String)
    RSearch = InStrRev(str, find)
End Function

और आपका कार्य इस तरह दिखेगा (मूल स्ट्रिंग B1 में है):

=LEFT(B1,RSearch(B1,"\"))

2
यह एक बहुत ही सरल लेकिन काम करने वाला उपाय है। यदि आप अपने प्रोजेक्ट में कुछ VBA का उपयोग कर सकते हैं, तो इस एक का उपयोग करें।
पैट्रिक हॉफमैन

7

टाइगरवतार और जीन-फ्रांस्वा कॉर्बेट ने इस सूत्र का उपयोग करने का सुझाव दिया कि "\" वर्ण की अंतिम घटना के स्ट्रिंग अधिकार को उत्पन्न करने के लिए।

=TRIM(RIGHT(SUBSTITUTE(A1,"\",REPT(" ",LEN(A1))),LEN(A1)))

यदि विभाजक के रूप में उपयोग किया जाने वाला वर्ण अंतरिक्ष है, "", तो सूत्र को निम्न में बदलना होगा:

=SUBSTITUTE(RIGHT(SUBSTITUTE(A1," ",REPT("{",LEN(A1))),LEN(A1)),"{","")

उल्लेख करने की आवश्यकता नहीं है, "{" वर्ण को किसी भी वर्ण से बदला जा सकता है जो कि प्रक्रिया में "सामान्य रूप से" नहीं होता है।


मुझे यह समाधान तरीका अधिक सुरुचिपूर्ण और समझ में आता है। यदि आप LEN (A1) को एक संख्या से गुणा करते हैं, तो आप अंतिम घटना के लिए nth प्राप्त कर सकते हैं, बशर्ते आपके मूल स्ट्रिंग में रिक्त स्थान नहीं है (जो मेरे लिए मामला था)
Zlatin Zlatev

4

बस इस समाधान के साथ आया, कोई वीबीए की जरूरत नहीं;

मेरे उदाहरण में "_" का अंतिम रोड़ा खोजें;

=IFERROR(FIND(CHAR(1);SUBSTITUTE(A1;"_";CHAR(1);LEN(A1)-LEN(SUBSTITUTE(A1;"_";"")));0)

अंदर बाहर समझाया;

SUBSTITUTE(A1;"_";"") => replace "_" by spaces
LEN( *above* ) => count the chars
LEN(A1)- *above*  => indicates amount of chars replaced (= occurrences of "_")
SUBSTITUTE(A1;"_";CHAR(1); *above* ) => replace the Nth occurence of "_" by CHAR(1) (Nth = amount of chars replaced = the last one)
FIND(CHAR(1); *above* ) => Find the CHAR(1), being the last (replaced) occurance of "_" in our case
IFERROR( *above* ;"0") => in case no chars were found, return "0"

आशा है कि यह मददगार था।


3

आप एक स्ट्रिंग के भीतर एक स्ट्रिंग के अंतिम उदाहरण को खोजने के लिए मेरे द्वारा बनाए गए इस फ़ंक्शन का उपयोग कर सकते हैं।

निश्चित रूप से स्वीकृत एक्सेल सूत्र काम करता है, लेकिन इसे पढ़ना और उपयोग करना बहुत मुश्किल है। कुछ बिंदु पर आपको छोटे टुकड़ों में तोड़ना होगा ताकि यह बनाए रखा जा सके। नीचे मेरा फ़ंक्शन पठनीय है, लेकिन यह अप्रासंगिक है क्योंकि आप इसे नामांकित मापदंडों का उपयोग करके सूत्र में कहते हैं। यह इसका उपयोग सरल बनाता है।

Public Function FindLastCharOccurence(fromText As String, searchChar As String) As Integer
Dim lastOccur As Integer
lastOccur = -1
Dim i As Integer
i = 0
For i = Len(fromText) To 1 Step -1
    If Mid(fromText, i, 1) = searchChar Then
        lastOccur = i
        Exit For
    End If
Next i

FindLastCharOccurence = lastOccur
End Function

मैं इसे इस तरह से उपयोग करता हूं:

=RIGHT(A2, LEN(A2) - FindLastCharOccurence(A2, "\"))

2

@SSilk द्वारा किए गए एक टिप्पणी के एक हिस्से को ध्यान में रखते हुए मेरा अंतिम लक्ष्य वास्तव में सब कुछ पाने का रहा है, जिसमें अंतिम घटना का एक बहुत ही सरल सूत्र के साथ एक वैकल्पिक दृष्टिकोण Aहै तार के एक स्तंभ (कहना ) की नकल करना और प्रतिलिपि पर (कहना) ColumnB) फाइंड एंड रिप्लेस लागू करें। उदाहरण के लिए उदाहरण के लिए:Drive:\Folder\SubFolder\Filename.ext

क्या ढूँडो

यह Filename.extजो कुछ भी चरित्र को चुना गया है उसके अंतिम उदाहरण के बाद (यहाँ ) रहता है \जो कि कभी-कभी वैसे भी उद्देश्य होता है और पिछले ऐसे चरित्र की स्थिति को खोजने की सुविधा प्रदान करता है जैसे कि संक्षिप्त रूप:

=FIND(B1,A1)-1

1

मुझे पार्टी में थोड़ी देर हो गई है, लेकिन शायद यह मदद कर सकता है। प्रश्न के लिंक में एक समान सूत्र था, लेकिन मेरा त्रुटियों से छुटकारा पाने के लिए IF () कथन का उपयोग करता है।

यदि आप Ctrl + Shift + Enter से डरते नहीं हैं, तो आप एक सरणी सूत्र के साथ बहुत अच्छा कर सकते हैं।

स्ट्रिंग (सेल A1 में): "one.two.three.four"

सूत्र:

{=MAX(IF(MID(A1,ROW($1:$99),1)=".",ROW($1:$99)))}  use Ctrl+Shift+Enter

परिणाम: 14

प्रथम,

ROW($1:$99)

1 से 99 तक पूर्णांक की एक सरणी देता है {1,2,3,4,...,98,99}:।

आगे,

MID(A1,ROW($1:$99),1)

लक्ष्य स्ट्रिंग में पाए जाने वाले 1-लंबाई के तारों की एक सरणी देता है, फिर लक्ष्य स्ट्रिंग की लंबाई तक पहुंचने के बाद खाली तार देता है: {"o","n","e",".",..."u","r","","",""...}

आगे,

IF(MID(I16,ROW($1:$99),1)=".",ROW($1:$99))

सरणी में प्रत्येक आइटम को स्ट्रिंग के साथ तुलना करता है "।" और स्ट्रिंग या FALSE में वर्ण के इंडेक्स को लौटाता है:{FALSE,FALSE,FALSE,4,FALSE,FALSE,FALSE,8,FALSE,FALSE,FALSE,FALSE,FALSE,14,FALSE,FALSE.....}

पिछले है,

=MAX(IF(MID(I16,ROW($1:$99),1)=".",ROW($1:$99)))

सरणी का अधिकतम मूल्य लौटाता है: 14

इस फॉर्मूले के लाभ यह है कि यह छोटा है, समझने में अपेक्षाकृत आसान है, और किसी भी अद्वितीय वर्ण की आवश्यकता नहीं है।

नुकसान Ctrl + Shift + Enter का उपयोग और स्ट्रिंग लंबाई पर सीमा का आवश्यक उपयोग है। यह नीचे दिखाए गए भिन्नता के साथ काम किया जा सकता है, लेकिन यह भिन्नता OFFSET () फ़ंक्शन का उपयोग करती है जो एक अस्थिर (पढ़ें: धीमा) फ़ंक्शन है।

निश्चित नहीं है कि इस फॉर्मूले की गति क्या है।

बदलाव:

=MAX((MID(A1,ROW(OFFSET($A$1,,,LEN(A1))),1)=".")*ROW(OFFSET($A$1,,,LEN(A1)))) works the same way, but you don't have to worry about the length of the string

=SMALL(IF(MID(A1,ROW($1:$99),1)=".",ROW($1:$99)),2) determines the 2nd occurrence of the match

=LARGE(IF(MID(A1,ROW($1:$99),1)=".",ROW($1:$99)),2) determines the 2nd-to-last occurrence of the match

=MAX(IF(MID(I16,ROW($1:$99),2)=".t",ROW($1:$99))) matches a 2-character string **Make sure you change the last argument of the MID() function to the number of characters in the string you wish to match!



0

पार्टी के लिए बहुत देर हो चुकी है, लेकिन एक सरल समाधान कस्टम फ़ंक्शन बनाने के लिए VBA का उपयोग कर रहा है।

कार्यपुस्तिका, वर्कशीट या VBA मॉड्यूल में VBA में फ़ंक्शन जोड़ें

Function LastSegment(S, C)
    LastSegment = Right(S, Len(S) - InStrRev(S, C))
End Function

फिर सेल सूत्र

=lastsegment(B1,"/")

एक सेल में और सेल B1 में खोजा जाने वाला स्ट्रिंग सेल B1 से अंतिम "/" के पाठ के साथ सेल को पॉप्युलेट करेगा। कोई लंबाई सीमा नहीं, कोई अस्पष्ट सूत्र नहीं। केवल मुझे लगता है कि मैक्रो-सक्षम कार्यपुस्तिका की आवश्यकता है।

किसी भी उपयोगकर्ता VBA फ़ंक्शन को सेल सूत्र के मान को वापस करने के लिए इस तरह से कहा जा सकता है, जिसमें एक बिल्ट एक्सेल फ़ंक्शन के पैरामीटर के रूप में शामिल है।

यदि आप फ़ंक्शन का भारी उपयोग करने जा रहे हैं, तो आप मामले की जांच करना चाहेंगे जब चरित्र स्ट्रिंग में नहीं है, तो स्ट्रिंग रिक्त है, आदि।


0

सेल A1 = find/the/position/of/the last slash

इसे करने का सरल तरीका पाठ को उल्टा करना है और फिर पहले स्लैश को सामान्य रूप में ढूंढें। अब आप इस संख्या को पूर्ण पाठ ऋण की लंबाई प्राप्त कर सकते हैं।

इस तरह:

=LEN(A1)-FIND("/",REVERSETEXT(A1),1)+1

यह रिटर्न 21, अंतिम की स्थिति /


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