Mam następujące dane:
http://123.456.789.10.com
http://789.12340.com
http://456.789.1123123rs.com
http://12321.com
To, co próbuję zrobić, to doprowadzić tekst do drugiego do ostatniego okresu. na przykład formuła powinna zwrócić te wartości:
10.com
12340.com
1123123rs.com
12321.com
Uwaga: jeśli jest tylko jeden okres (jak w poprzednim przykładzie), chcę się go pozbyć do (włącznie) ://
.
Próbowałem: (wartość jest przechowywana w komórce D2)
=RIGHT(D2,FIND(".",D2,FIND(".",D2)+1)-1)
(co nie działa dobrze, gdy używasz PRAWEGO, ale działa idealnie, gdy używasz LEWEGO)
=RIGHT(D2,FIND(".",D2)+1)
Nie wiem czego mi brakuje ...
Czy ktoś może pomóc?
microsoft-excel
microsoft-excel-2016
MrServer
źródło
źródło
http://0.1.2.3.4.5.6.7.8.9.arenumbers.com
staje się,2.3.4.5.6.7.8.9.arenumbers.com
czy staje sięarenumbers.com
?Odpowiedzi:
Jestem pewien, że następująca formuła zrobi to, co chcesz:
Krótkie streszczenie algorytmu:
użyj narzędzia oceny formuły, aby rozedrzeć go na strzępy i zobaczyć, jak to działa szczegółowo. Jak zauważono w komentarzach, zobaczysz, że
99
ogranicza to liczbę znaków, które możesz zwrócić. Może to wymagać zmiany, jeśli zwracane dane mogą być dłuższe://
FIND
funkcji, aby zlokalizować to podstawienie, aby wygenerować numer początkowyMID
funkcjiźródło
CHAR(1)
jest dobrym pomysłem, ale nie działa, jeśli efekt końcowy jest bardzo długi, ponieważ skraca go do 99 znaków.99
goLEN(A1)
, wtedy maksymalna długość wyniku byłaby długością oryginalnego tekstu, a zatem zawsze będzie co najmniej tak długa (faktycznie dłuższa niż) rzeczywisty wynik.Wyjaśnienie:
Po pierwsze, otrzymujemy liczbę okresów za pomocą tej prostej sztuczki:
=LEN(D2)
(patrz kolumnaE
na obrazku)=LEN(SUBSTITUTE(D2, ".", ""))
(patrz kolumnaF
na obrazku)=LEN(D2) - LEN(SUBSTITUTE(D2, ".", ""))
(patrz kolumnaG
na zdjęciu)Po drugie, znając liczbę okresów , jesteśmy w stanie określić liczbę wystąpień okresu przedostatniego . Na przykład, jeśli liczba okresów wynosi
5
, przedostatni okres ma numer wystąpienia4
:=LEN(D2) - LEN(SUBSTITUTE(D2, ".", "")) - 1
(patrz kolumnaH
na zdjęciu)Po trzecie, używamy tego jako czwartego parametru funkcji SUBSTITUTE (), aby zastąpić wystąpienie kropki
\
symbolem:=SUBSTITUTE(D2, ".", "\", LEN(D2) - LEN(SUBSTITUTE(D2, ".", "")) - 1)
(patrz kolumnaI
na zdjęciu)Po czwarte, określamy pozycję tego symbolu (
\
) za pomocą funkcji FIND ():=FIND("\", SUBSTITUTE(D2, ".", "\", LEN(D2) - LEN(SUBSTITUTE(D2, ".", "")) - 1))
(patrz kolumnaJ
na zdjęciu)Po piąte, znając pozycję tego symbolu (
\
) i długość pełnego tekstu, możemy określić liczbę pozostałych symboli , tj. Symboli po\
. Na przykład, jeśli długość pełnego tekstu wynosi 5, a pozycja\
wynosi 3, pozostały 2 symbole:=LEN(D2) - FIND("\", SUBSTITUTE(D2, ".", "\", LEN(D2) - LEN(SUBSTITUTE(D2, ".", "")) - 1))
(patrz kolumnaK
na zdjęciu)Wreszcie używamy go jako drugiego parametru
RIGHT()
funkcji:=RIGHT(D2, LEN(D2) - FIND("\", SUBSTITUTE(D2, ".", "\", LEN(D2) - LEN(SUBSTITUTE(D2, ".", "")) - 1))
(patrz kolumnaL
na zdjęciu)i jest to ostateczna formuła .
Uwaga:
Ostatni przykład w pytaniu nie ma drugiego, ale jeden kropka (w sprzeczności z tytułem pytania). Aby uwzględnić taką możliwość, dodaj
.
pohttp://
, tj. Zamień wszystkoD2
w formule naźródło
\
znaki po://
. Jeśli używasz tej formuły, zalecam użycie sztuczki @ RonRosenfelda polegającej na użyciuCHAR(1)
zamiast\
, ponieważ znacznie mniej prawdopodobne jest, że Twoje dane będą zawierać znak „Początek nagłówka” niż a\
.=IF(LEN(A1)-LEN(SUBSTITUTE(A1, ".", "", 2)), SUBSTITUTE(TRIM(RIGHT(SUBSTITUTE(A1, ".", REPT(" ", LEN(A1))), LEN(A1)*2)), " ", "."), IFERROR(RIGHT(A1, LEN(A1)-FIND("://", A1)-2), A1))
Jak to działa?
Najpierw mamy
IF
oświadczenie, które pozwala nam traktować rzeczy inaczej, jeśli jest jeden (lub mniej) okres, lub jeśli są co najmniej 2 okresy.Nasz test logiczny polega na sprawdzeniu, czy istnieje drugi okres:
LEN(A1)-LEN(SUBSTITUTE(A1, ".", "", 2))
Zwróci się,
0
jeśli nie będzie w stanie znaleźć 2 kropek w ciągu, lub1
) jeśli są 2 lub więcej.Następnie najpierw stawiamy formułę „jeśli są 2 lub więcej okresów”, a drugą „jeśli jest mniej niż 2 okresy”, ale ponieważ ta ostatnia jest znacznie prostsza, omówię ją najpierw.
Jeśli są mniej niż 2 okresy:
Jeśli występuje jeden lub zero okresów, musimy usunąć tekst do
://
początku włącznie , więc znajdziemy pozycję://
i weźmiemy tylko tekst po nim:RIGHT(A1, LEN(A1)-FIND("://", A1)-2)
na wypadek, gdyby dane zawierały dane „ t zaczynając od protokołu kończącego się na
://
, powinniśmy otoczyć toIFERROR
i otrzymać cały oryginalny ciąg zamiast#VALUE
błędu, co kończy się następująco:IFERROR(RIGHT(A1, LEN(A1)-FIND("://", A1)-2), A1)
Jeśli są (co najmniej) 2 okresy
Teraz, gdy mamy prostsze przypadki na bok, spójrzmy na to, co się stanie, gdy będą 2 (lub więcej) okresów:
SUBSTITUTE(TRIM(RIGHT(SUBSTITUTE(A1, ".", REPT(" ", LEN(A1))), LEN(A1)*2)), " ", ".")
Rozbijmy to:
SUBSTITUTE(A1, ".", REPT(" ", LEN(A1)))
RIGHT(<step 1>, LEN(A1)*2)
Uwaga: Jeśli chcesz dołączyć również następną sekcję, zmienisz
*2
na*3
.TRIM
, pozostawiając nam tylko jedno miejsce, gdzie pozostałym okresem powinien być:TRIM(<step 2>)
.
:SUBSTITUTE(<step 3>, " ", ".")
Nasza cała formuła to:
=IF(LEN(A1)-LEN(SUBSTITUTE(A1, ".", "", 2)), SUBSTITUTE(TRIM(RIGHT(SUBSTITUTE(A1, ".", REPT(" ", LEN(A1))), LEN(A1)*2)), " ", "."), IFERROR(RIGHT(A1, LEN(A1)-FIND("://", A1)-2), A1))
źródło
" "
jeCHAR(172)
w obu miejscach, w których jest on używany, zapobiegając w ten sposób niektórym problemom, które mogą wystąpić z powodu danych zawierających spacje. (Uwaga: nadal mogą występować problemy, jeśli wyniki muszą zawierać wiele spacji obok siebie.)Zwykła formuła używa
SUBSTITUTE()
do zastąpienia wszystkich interesujących znaków, w tym przypadku kropki, ciągami, które są arbitralnie długie w porównaniu z danymi, które można rozsądnie znaleźć w komórce.Na przykład, jeśli najdłuższy zestaw znaków między kropkami może wynosić 95 w oczekiwanych danych, to łańcuch zastępczy, powiedzmy, 250 „spacji” zastępujących każdy okres, działałby dobrze.
Następnie zawiń
SUBSTITUTE()
funkcję wRIGHT()
funkcję. Jeśli wynik ma mieć tylko 3 znaki, potrzebujesz 253 znaków po prawej stronie. Masz 502, zanim odbierzesz coś niepożądanego. Jeśli otrzymasz pełne oczekiwane 95 plus 250 spacji plus kolejne 95, potrzebujesz 420 znaków, aby się zakryć. Ale nadal masz 502, które możesz zabrać bez przyjmowania niepożądanych postaci. Wybierz więc liczbę między maksymalną, jakiej oczekujesz, 420 a masą, której możesz użyć, 502: być może 490, i weź 490 znaków z prawej strony za pomocąRIGHT()
funkcji.Teraz obejmij tę
SUBSTITUTE()
funkcję, tym razem zastępując spacje znakiem „”, aby wszystkie wprowadzone spacje zniknęły i uzyskałeś pożądany rezultat.Jeśli spacje mogą być pożądanym rezultatem, użyj innej postaci, która nie będzie. Coś dziwnie wygląda na liście możliwych znaków czcionki. Być może ¬ (Alt-01452). Lub nie ryzykuj i używaj tego zamiast używać spacji.
Nie wpisuj też 250 spacji. Użyj
REPT()
funkcji w pierwszej funkcji (wewnętrznej),SUBSTITUTE()
aby wpisać wybrany znak raz, ale zdobądź 250 z nich!Istnieją inne podejścia, ale zwykle polegają na wiedzy, ile znaków może być. Na przykład Twoje dane mogą być wystarczająco dobrze uformowane, aby wiedzieć, że zawsze są 4 okresy. To działa ładnie. Ale jeśli mogłoby się różnić, 3 tutaj, 7 tam, cóż ...
Powyższe jest raczej „brutalne” niż „eleganckie”, ale kogo to naprawdę obchodzi? Prosty w koncepcji, łatwy w użyciu i robi to samo.
źródło