Czy istnieje skuteczny sposób identyfikacji ostatniego dopasowania znak/ciąg w ciągu znaków przy użyciu funkcji podstawowych? To znaczy. nie ostatni znak/ciąg z ciąg, ale pozycja ostatniego wystąpienia znaku/ciągu znaków w ciągu. Search
i find
oba działają od lewej do prawej, więc nie mogę myśleć, jak zastosować bez długiego algorytmu rekursywnego. I this solution wydaje się teraz przestarzałe.Excel: dopasowanie ostatniego znaku/ciągu w ciągu znaków
Odpowiedz
Myślę, że rozumiem co masz na myśli. Powiedzmy na przykład chcesz najbardziej po prawej \ w następujący ciąg (który jest przechowywany w komórce A1):
dysk: \ Folder \ podkatalog \ nazwa_pliku.ext
Aby uzyskać pozycję ostatniego \ , należy użyć następującego wzoru:
=FIND("@",SUBSTITUTE(A1,"\","@",(LEN(A1)-LEN(SUBSTITUTE(A1,"\","")))/LEN("\")))
to nam mówi prawym najbardziej \ jest znakiem 24. czyni to poprzez patrząc na „@” i zastąpienie bardzo ostatnio „\” z „@”. Określa on ostatnią za pomocą
(len(string)-len(substitute(string, substring, "")))\len(substring)
W tym scenariuszu podciąg jest po prostu „\”, który ma długość 1, więc można zostawić poza podział na końcu i po prostu użyć:
=FIND("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))
teraz możemy używać, aby uzyskać ścieżkę folderu:
=LEFT(A1,FIND("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\","")))))
Oto ścieżka folderu bez tylnego \
=LEFT(A1,FIND("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))-1)
i uzyskać tylko nazwę pliku:
=MID(A1,FIND("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))+1,LEN(A1))
Jednak tutaj jest alternatywna wersja postawienie wszystkiego na prawo od ostatniej instancji szczególnym charakterze. Tak chętnie sam przykład, byłoby to również powrót nazwę pliku:
=TRIM(RIGHT(SUBSTITUTE(A1,"\",REPT(" ",LEN(A1))),LEN(A1)))
przędzenie głowy; spinnning głowy; kręcenie głową; "ok - nie chcesz tego używać bez zrozumienia go, więc ... uh huh, ok, uh huh ... czekaj co? tak! naprawdę to geniusz Czuję się pewnie, że nie pomyślałbym o tym za kilka godzin jeśli nie dni lub tygodnie! " - +1, niestety, ponieważ +5 lub +10 jest trudne do zrobienia samemu --- jeśli-utknąłeś-wyjaśnienie: (używając przykładu) 'SUBSTITUTE' wszystkie (3) wystąpienia' '\' 'with nothing (skróć długość ciągu o 3) -> że' '\' '(the 3rd) jest ostatnim; zastąp to czymś wyjątkowym i 'ZNAJDŹ' pozycję tej wyjątkowej postaci ... niesamowitej ... dzięki! –
To jest sprytne. Po prostu musisz się wystrzegać, że komórka nie zawiera już znaku "@", w przeciwnym razie będziesz musiał użyć czegoś innego. Możesz sprawdzić używając '= ISNUMBER (SEARCH (" @ ", A1))', [zgodnie z propozycją @ gwin003] (http://stackoverflow.com/questions/18617175/excel-check-if-a-cell-contains -a-podciąg). – geotheory
Twoja ostatnia opcja wyodrębniania wszystkiego na prawo od ostatniego wystąpienia jest bardzo doceniana, ponieważ przez większość czasu szukałem "ostatniego wystąpienia ciągu x w ciągu y", moim celem końcowym było naprawdę wszystko. prawo do tego ostatniego wystąpienia. – SSilk
Można użyć tej funkcji stworzyłem aby znaleźć ostatnią instancję ciąg wewnątrz łańcucha.
Pewnie przyjęta formuła programu Excel działa, ale jest zbyt trudna do odczytania i użycia. W pewnym momencie musisz się rozpaść na mniejsze kawałki, aby można je było utrzymać. Moja funkcja poniżej jest czytelna, ale nie ma to znaczenia, ponieważ wywołujesz ją w formule przy użyciu nazwanych parametrów. To sprawia, że korzystanie z niego jest proste.
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
używam go tak:
=RIGHT(A2, LEN(A2) - FindLastCharOccurence(A2, "\"))
Jak na temat tworzenia i korzystania z funkcji niestandardowej, że w formule? VBA ma wbudowaną funkcję, InStrRev
, która dokładnie to, czego szukasz.
umieścić to w nowym module:
Function RSearch(str As String, find As String)
RSearch = InStrRev(str, find)
End Function
A twoja funkcja będzie wyglądać następująco (przy założeniu, oryginalny łańcuch jest w B1):
=LEFT(B1,RSearch(B1,"\"))
To bardzo proste, ale działające rozwiązanie .Jeśli możesz użyć VBA w swoim projekcie, użyj tego. –
prosty sposób to zrobić w VBA jest:
YourText = "c:\excel\text.txt"
xString = Mid(YourText, 2 + Len(YourText) - InStr(StrReverse(YourText), "\"))
tigeravatar i Jean-Francois Corbett zasugerowali, aby użyć tej formuły do wygenerowania ciągu znaków z prawej ostatnie wystąpienie znaku "\"
=TRIM(RIGHT(SUBSTITUTE(A1,"\",REPT(" ",LEN(A1))),LEN(A1)))
Jeśli znak używany jako separator jest przestrzeń, "", wówczas formuła musi zostać zmienione na:
=SUBSTITUTE(RIGHT(SUBSTITUTE(A1," ",REPT("{",LEN(A1))),LEN(A1))),"{","")
Nie trzeba wspomnieć, The " {"Postać może być zastąpiona dowolną postacią, która" normalnie "nie występuje w tekście do przetworzenia.
Jestem trochę spóźniony na imprezę, ale może to może pomóc. Link w pytaniu miał podobną formułę, ale moja używa instrukcji IF(), aby pozbyć się błędów.
Jeśli nie boisz się Ctrl + Shift + Enter, możesz całkiem dobrze wykorzystać formułę tablicową.
łańcuch znaków (na komórki A1) "one.two.three.four"
Wzór:
{=MAX(IF(MID(A1,ROW($1:$99),1)=".",ROW($1:$99)))} use Ctrl+Shift+Enter
Wynik: 14
pierwsze
ROW($1:$99)
zwraca tablicę liczb całkowitych od 1 do 99: {1,2,3,4,...,98,99}
.
Następnie
MID(A1,ROW($1:$99),1)
zwraca tablicę ciągów 1 długości występujących w ciągu docelowym, a następnie zwraca puste ciągi po długości łańcucha cel został osiągnięty: {"o","n","e",".",..."u","r","","",""...}
Dalej,
IF(MID(I16,ROW($1:$99),1)=".",ROW($1:$99))
porównuje każdy element w tablicy z łańcuchem "." i zwraca albo indeks znaku w łańcuchu czy fałsz: {FALSE,FALSE,FALSE,4,FALSE,FALSE,FALSE,8,FALSE,FALSE,FALSE,FALSE,FALSE,14,FALSE,FALSE.....}
ostatni
=MAX(IF(MID(I16,ROW($1:$99),1)=".",ROW($1:$99)))
Zwraca maksymalną wartość tablicy: 14
zalet tego wzoru jest to, że jest krótki , stosunkowo łatwe do zrozumienia i nie wymaga żadnych unikalnych znaków.
Wadami są wymagane użycie kombinacji Ctrl + Shift + Enter i ograniczenie długości łańcucha. Można to obrobić przy wariacji pokazanej poniżej, ale ta odmiana wykorzystuje funkcję PRZESUNIĘCIE(), która jest funkcją lotną (odczyt: wolna).
Nie wiem, jaka jest szybkość tej formuły w porównaniu do innych.
Wariacje:
=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!
Wystarczy wymyślił tego rozwiązania, bez VBA potrzebne;
Znajdź ostatni występ "_" w moim przykładzie;
=IFERROR(FIND(CHAR(1);SUBSTITUTE(A1;"_";CHAR(1);LEN(A1)-LEN(SUBSTITUTE(A1;"_";"")));0)
Objaśnienie od wewnątrz;
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"
Mam nadzieję, że było to pomocne.
Biorąc pod uwagę część komentarza dokonanej przez @SSilkmój koniec bramki naprawdę było dostać wszystko na prawo od tego ostatniego wystąpienia alternatywne podejście z bardzo prostego wzoru jest skopiować kolumnę (słownie A
) ciągów a na kopii (powiedzmy w kolumnie B) zastosowanie Znajdź i zamień. Na przykład biorąc przykład: Drive:\Folder\SubFolder\Filename.ext
ta zwraca co pozostaje (tutaj Filename.ext
) po ostatniej instancji bez względu na postać jest wybrana (tutaj \
), który jest czasami cel i tak ułatwia znalezienie pozycję ostatni taki znak z krótkiej formuły takie jak:
=FIND(B1,A1)-1
bardzo późno do partii, ale proste rozwiązanie jest przy użyciu VBA, aby utworzyć funkcję niestandardową.
Dodaj funkcję VBA w skoroszycie arkusza lub modułu VBA
Function LastSegment(S, C)
LastSegment = Right(S, Len(S) - InStrRev(S, C))
End Function
Wtedy formuła komórka
=lastsegment(B1,"/")
w komórce i ciąg do przeszukania w komórce B1 będzie wypełnij komórkę tekstem kończącym ostatni "/" z komórki B1. Brak limitu długości, żadnych niejasnych formuł. Jedynym minusem, jaki mogę sobie wyobrazić, jest potrzeba skoroszytu z obsługą makr.
Dowolną funkcję VBA użytkownika można wywołać w ten sposób, aby zwrócić wartość do formuły komórki, w tym jako parametr wbudowanej funkcji programu Excel.
Jeśli zamierzasz korzystać z funkcji mocno będziemy chcieli sprawdzić przypadku, gdy znak nie jest w łańcuchu, a następnie ciąg jest pusty, itp
- 1. Dzielenie ostatniego separatora w ciągu znaków w języku Python?
- 2. Wstawianie do ciągu znaków Excel VBA
- 3. Java: Najprostszy sposób na uzyskanie ostatniego słowa w ciągu znaków
- 4. Uzyskiwanie ostatniego słowa z ciągu znaków w JavaScript
- 5. Python: zamień terminy w ciągu znaków z wyjątkiem ostatniego
- 6. Znajdowanie ostatniego indeksu łańcucha znaków w Oracle
- 7. Zapytanie SQL Server o usunięcie ostatniego słowa z ciągu znaków
- 8. Symulacja dzielenia ciągu znaków w formule Excela
- 9. Usuwanie znaków z ciągu znaków
- 10. Dopasowywanie sekwencji kolejnych znaków w ciągu znaków
- 11. Zliczanie liczby znaków w ciągu znaków
- 12. Zastępowanie wielu znaków w ciągu znaków
- 13. Usuwanie białych znaków w ciągu znaków
- 14. Usuwanie białych znaków w ciągu znaków XML
- 15. Zastępowanie wiodących znaków w ciągu znaków
- 16. Sprawdzanie znaków specjalnych w ciągu znaków
- 17. Zamień wiele znaków w ciągu znaków (XSLT)
- 18. Maksymalna zgodność dla ciągu znaków
- 19. Excel VBA - usuwanie treści ciągu do * słowa *
- 20. Excel vba - skonwertuj ciąg znaków na numer
- 21. Wyszukaj słowo w ciągu znaków
- 22. zawaleniem spacje w ciągu znaków
- 23. Co {} robi w ciągu znaków?
- 24. Rozdzielanie ciągu znaków w C++
- 25. Cofanie słów w ciągu znaków
- 26. Jak znaleźć ostatnie wystąpienie zestawu znaków z ciągu znaków
- 27. Pierwsze 10 znaków ciągu?
- 28. Tłumaczenie przypisanego ciągu znaków
- 29. grep bez ciągu znaków
- 30. Parsowanie ciągu znaków
Bo chcę położenie ostatniej instancji na przykład Kropka "." w napisie "one.two.three.four" – geotheory
Zabawne, jak błędna lektura pytania zjednoczy się w głosowaniu – geotheory
Powiedziałbym, spójrz na to z innej perspektywy, oznacza to, że inni ludzie również nie rozumieli co masz na myśli na twoje pytanie i tak się domyśliłem, że sugestia była właściwym rozwiązaniem ...Nawet wybrana odpowiedź zaczęła się od słowa "Myślę, że rozumiem, co masz na myśli" ... Nie krytyki, ale raczej prośby o ułatwienie odpowiedzi na pytania, które pomogą ludziom łatwiej odpowiedzieć. –