Usuń tekst do (włącznie) od drugiej do ostatniej kropki (lub `: //` jeśli tylko jedna kropka)

0

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?

MrServer
źródło
2
Twoje przykłady są sprzeczne z opisem problemu.
AFH,
Od drugiego okresu od lewej, czy od prawej?
MarianD
1
@MarianD Aby dodać do pytania MarianD i czego chcesz, gdy jest tylko jedna kropka?
Rey Juna,
Tak więc, aby zweryfikować ... Czy chcesz tekst po drugim okresie od lewej, czy chcesz tekst po drugim okresie od prawej? tj. http://0.1.2.3.4.5.6.7.8.9.arenumbers.comstaje się, 2.3.4.5.6.7.8.9.arenumbers.comczy staje się arenumbers.com?
3D1T0R,
arenumbers.com to wynik, którego szukam.
MrServer

Odpowiedzi:

1

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 99ogranicza to liczbę znaków, które możesz zwrócić. Może to wymagać zmiany, jeśli zwracane dane mogą być dłuższe

  • usuń wszystko do włącznie ://
  • zamień drugą od ostatniej kropki na rzadko używaną postać
  • użyj FINDfunkcji, aby zlokalizować to podstawienie, aby wygenerować numer początkowy MIDfunkcji

=MID(A1,FIND("://",A1)+2+FIND(CHAR(1),SUBSTITUTE("." &MID(A1,FIND("://",A1)+3,99),".",CHAR(1),LEN("." &A1)-LEN(SUBSTITUTE("." &A1,".",""))-1)),99)

wprowadź opis zdjęcia tutaj

Ron Rosenfeld
źródło
Twoje użycie 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.
3D1T0R,
@ 3D1T0R Działa dla podanych przykładów. Jeśli wyniki końcowe są dłuższe we własnych danych, należy zmienić tę wartość, aby łańcuch nie został obcięty.
Ron Rosenfeld,
Nie mam danych, które moim zdaniem tego potrzebują, po prostu wskazując na problem, aby ktoś, kto ma bardzo długie dane, mógł zobaczyć, że to nie będzie dla nich dobre.
3D1T0R,
@ 3D1T0R OK. Mam inne oczekiwania odbiorców. Myślę, że twój komentarz mógłby być przydatny, gdybyś napisał coś, co wskazuje, że ten parametr może wymagać dostosowania w przypadku bardzo długich danych. Zamiast tego wskazałem, że czytelnik powinien użyć narzędzia oceny formuły do ​​zbadania szczegółów. W ten sposób powinni być w stanie to sobie wyobrazić.
Ron Rosenfeld,
1
Możesz łatwo rozwiązać problem, który wskazałem, zastępując 99go LEN(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.
3D1T0R,
0
=RIGHT(D2, 
 LEN(D2) - FIND("\", SUBSTITUTE(D2, ".", "\", LEN(D2) - LEN(SUBSTITUTE(D2, ".", "")) - 1))

Wyjaśnienie:

Po pierwsze, otrzymujemy liczbę okresów za pomocą tej prostej sztuczki:

  1. Określamy długość pełnego tekstu :
    =LEN(D2) (patrz kolumna Ena obrazku)
  2. Ustalamy długość tego samego tekstu, ale z usuniętymi wszystkimi kropkami :
    =LEN(SUBSTITUTE(D2, ".", "")) (patrz kolumna Fna obrazku)
  3. Różnica będzie liczba okresów :
    =LEN(D2) - LEN(SUBSTITUTE(D2, ".", "")) (patrz kolumna Gna 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ąpienia 4:

  • =LEN(D2) - LEN(SUBSTITUTE(D2, ".", "")) - 1 (patrz kolumna Hna 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 kolumna Ina zdjęciu)

Po czwarte, określamy pozycję tego symbolu ( \) za pomocą funkcji FIND ():

  • =FIND("\", SUBSTITUTE(D2, ".", "\", LEN(D2) - LEN(SUBSTITUTE(D2, ".", "")) - 1)) (patrz kolumna Jna 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 kolumna Kna 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 kolumna Lna zdjęciu)

i jest to ostateczna formuła .

wprowadź opis zdjęcia tutaj


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 .po http://, tj. Zamień wszystko D2w formule na

=SUBSTITUTE(D2, "//", "//.")
MarianD
źródło
Uwaga: Zepsuje się, jeśli dane zawierają \znaki po ://. Jeśli używasz tej formuły, zalecam użycie sztuczki @ RonRosenfelda polegającej na użyciu CHAR(1)zamiast \, ponieważ znacznie mniej prawdopodobne jest, że Twoje dane będą zawierać znak „Początek nagłówka” niż a \.
3D1T0R,
@ 3D1T0R znak ukośnika odwrotnego (\) jest niedozwolony w identyfikatorach URI, a więc także w adresach URL - patrz Rozdział 2 (Znaki) w RFC 3986 .
MarianD,
To prawda, ale to nie znaczy, że w danych użytkownika nie ma ukośników odwrotnych. Inni mogą przyjść tutaj w przyszłości, którzy nie chcą używać tego z adresami URL, i mogą mieć odwrotne ukośniki lub inne nieoczekiwane znaki w swoich danych, ale jest mniej prawdopodobne, że będą mieli znaki, których nie można wpisać bezpośrednio na klawiaturze i jest bardzo mało prawdopodobne, że będą mieli w swoich znakach znak „Początek nagłówka”, chyba że jest to uszkodzone, w takim przypadku są inne rzeczy, które powinni zrobić z danymi przed przetworzeniem ich w ten sposób.
3D1T0R,
0

=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 IFoś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ę, 0jeśli nie będzie w stanie znaleźć 2 kropek w ciągu, lub 1) 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ć to IFERRORi otrzymać cały oryginalny ciąg zamiast #VALUEbłę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:

  1. Zastępujemy wszystkie kropki dużą liczbą spacji (tyle, ile znaków w całym oryginalnym ciągu): SUBSTITUTE(A1, ".", REPT(" ", LEN(A1)))
  2. Bierzemy tylko jego koniec, a konkretnie dwukrotność długości oryginalnego łańcucha. To daje nam dwie ostatnie części i kilka spacji przed i między 2 częściami: RIGHT(<step 1>, LEN(A1)*2)
    Uwaga: Jeśli chcesz dołączyć również następną sekcję, zmienisz *2na *3.
  3. Usuwamy wszystkie obce przestrzenie za pomocą TRIM, pozostawiając nam tylko jedno miejsce, gdzie pozostałym okresem powinien być:TRIM(<step 2>)
  4. Zastępujemy jedną pozostałą przestrzeń .: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))

3D1T0R
źródło
Możesz także użyć znaku „Nie” zamiast spacji (jak sugeruje @Roy w swojej odpowiedzi), zastępując " "je CHAR(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.)
3D1T0R
0

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ę w RIGHT()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.

Roy
źródło