¿Cómo obtengo celdas en Excel que contienen direcciones IP para ordenar correctamente?

34

Actualmente estoy trabajando con una gran lista de direcciones IP (miles de ellas).

Sin embargo, cuando clasifico la columna que contiene las direcciones IP, no se clasifican de manera intuitiva o fácil de seguir.

Por ejemplo, si ingreso las direcciones IP de la siguiente manera:

ingrese la descripción de la imagen aquí

Y luego, si ordeno en orden ascendente, obtengo esto:

ingrese la descripción de la imagen aquí

¿Hay alguna forma de formatear las celdas para que, por ejemplo, una dirección IP de 17.255.253.65 aparezca después de 1.128.96.254 y antes de 103.236.162.56 cuando se ordena en orden ascendente?

Si no es así, ¿hay otra forma de lograr este objetivo final?

Monomeeth
fuente
3
La ordenación no se ve afectada por el formato de celda.
Blackwood
1
Eso es interesante: estaba bastante seguro de que el formato de una celda afectaría la clasificación en algunos casos y pensé que quizás este era uno de esos. ¡Gracias por la aclaración!
Monomeeth
1
¡Y Bruce lo ayudará si algo de esto necesita manejar direcciones IPv6!
Criggie

Respuestas:

42

Como te habrás dado cuenta, tus direcciones IP se tratan como texto y no como números. Se ordenan como texto, lo que significa que las direcciones que comienzan con "162" aparecerán antes que las direcciones que comienzan con "20." (porque el carácter "1" viene antes del carácter "2".

Puede usar la fórmula provista en esta respuesta: https://stackoverflow.com/a/31615838/4424957 para dividir la dirección IP en sus partes.

Si sus direcciones IP están en las columnas A, agregue las columnas BE como se muestra a continuación.

ingrese la descripción de la imagen aquí

Ingrese la fórmula

=VALUE(TRIM(MID(SUBSTITUTE($A2,".",REPT(" ",999)),(B$1)*999-998,999)))

en la celda B2 y cópielo en las columnas BE en todas las filas para obtener las cuatro partes de cada dirección IP. Ahora ordene todo el rango por las columnas B a E (en ese orden) como se muestra a continuación:

ingrese la descripción de la imagen aquí

Si no desea ver las columnas auxiliares (BE), puede ocultarlas.

Madera negra
fuente
12
En lugar de dividir en cuatro columnas, ¿tal vez sería mejor "concatenar" los bytes como first*256^3+second*256^2+third*256+fourthen una columna?
Ruslan
Especialmente porque las direcciones IPv4 son solo números de 32 bits. Las cuatro formas numéricas de 4 bits para mostrar las direcciones IP son únicamente para la lectura humana.
Kat
@Kat Estoy de acuerdo en que funcionaría, y solo requiere una columna auxiliar en lugar de cuatro. Pero la fórmula en esa columna sería bastante larga, por lo que elegí usar cuatro columnas (probablemente las escondería en cualquier caso).
Blackwood el
10

La solución más fácil de 3 pasos que te puedo sugerir es ...

  1. Seleccione la columna de dirección IP, aplique el comando Texto a columna .

  2. En la columna adyacente, escriba esta fórmula

    = CONCATENAR (B3, ".", C3, ".", D3, ".", E3)

  3. Finalmente ordenar en orden ascendente.

Verifique la captura de pantalla.

ingrese la descripción de la imagen aquí

NÓTESE BIEN:

El rojo es la dirección IP original (en la columna A).

Verde después de aplicar texto a la columna (columna B a E).

El negro se aplica después de concatenar y ordenar (columna F).

La razón por la que la dirección IP original es muy simple son los datos de texto y Excel no acepta ningún formato de celda para convertirlo en número.

Espero que esto te ayude.

Rajesh S
fuente
44
Esta terrible Nunca querrás mezclar datos de diferentes filas.
MaxW
@MaxW ,, ¡No entiendo exactamente lo que quieres decir!
Rajesh S
2
Significa que debería haber incluido la columna A original en el orden, de modo que las direcciones iP serían las mismas en cada fila.
Bandersnatch
1
No, nada malo hice, la demanda de OP fue ordenar la dirección IP en orden natural, (número) y la columna A en ROJO no está ordenada. La columna F ha ordenado la dirección IP en NEGRO.
Rajesh S
1
+1 Esta es la solución más fácil en la página. @RajeshS tal vez cambie la palabra 'ajustado' a 'adyacente' en su respuesta; pensé que se refería a una de las Text To Columncolumnas allí. @MaxW, el diseño es solo para demostración. Si desea que se ordene la IP original, simplemente ignore el paso 2. Esa fórmula masiva "VALOR (TRIM (MID (SUBSTITUTE") en la respuesta aceptada debe reemplazarse por "Texto a columnas" y el resto de la respuesta es esencialmente la misma.
mcalex
9

Aquí hay una función de VBA que escribí hace algún tiempo para resolver el mismo problema. Genera una versión acolchada de una dirección IPv4 que se ordena correctamente.

Function SortAddress(Address As String)                     '   format address as XXX.XXX.XXX.XXX to permit sorting

Dim FirstByte As Integer, LastByte As Integer, I As Integer

SortAddress = ""
FirstByte = 1

For I = 0 To 2                                          '   process the first three bytes

    LastByte = InStr(FirstByte, Address, ".")           '   find the dot
                                                        '   append the byte as 3 digits followed by dot
    SortAddress = SortAddress & Format(Mid(Address, FirstByte, LastByte - FirstByte), "000\.")

    FirstByte = LastByte + 1                            '   shift the start pointer

Next I

SortAddress = SortAddress & Format(Mid(Address, FirstByte), "000") ' process the last byte

End Function

Ejemplo simple:

Resultado

Resultado

Fórmulas

Fórmulas

Puede ordenar por la columna 'Ordenar' y ocultarlo.

grahamj42
fuente
44
Solo quiero señalar que la dirección IP ordenable se analizará como una dirección diferente de la original (porque algún idiota eligió interpretarlas como octales). Así que solo úselos para ordenar y no los trate como IP adecuadas.
CodesInChaos
Si vas a sacar vba, ¿por qué no solo tienes que hacer la clasificación?
Richard Tingle
1
@RichardTingle 1. Es (un poco) más trabajo 2. Puede que quiera ordenar la lista de varias maneras diferentes en diferentes momentos
grahamj42
7

Aquí hay una respuesta que tomará solo 1 columna de su tabla y convertirá la dirección IPv4 a numeración de base 10.

Como está poniendo sus datos en la columna "M", esto comienza en la celda M2 (M1 es la etiqueta). Encapsularlo como código da un desastre terrible, así que he usado blockquote:

= INT (IZQUIERDA (M2, FIND (".", M2) - 1)) * 256 ^ 3 + INT (MID (M2, FIND (".", M2) + 1, FIND (".", M2, FIND) (".", M2) + 1) - ENCONTRAR (".", M2) -1)) * 256 ^ 2 + INT (MEDIO (M2, ENCONTRAR (".", M2, ENCONTRAR (".", M2) + 1) + 1, FIND (".", M2, FIND (".", M2, FIND (".", M2) + 1) + 1) - FIND (".", M2, FIND ("." , M2) + 1) - 1)) * 256 + INT (DERECHA (M2, LEN (M2) - ENCONTRAR (".", M2, ENCONTRAR (".", M2, ENCONTRAR (".", M2) + 1 ) + 1)))

No es exactamente la fórmula más fácil de leer, pero puede copiar y pegar en su celda (preferiblemente N2 u otra cosa en la misma fila que su primera dirección IP). Presume que el formato correcto de la dirección IP como corrección de errores en la fórmula lo haría aún peor para el análisis humano.

RudyB
fuente
3

Si no desea usar fórmulas o VBA, use Power Query. (En Excel 2016, Get & Transform, en Excel 2010 o 2013, instale el complemento PowerQuery para seguir).

  1. Traiga la tabla al editor de PowerQuery.
  2. Duplicar la columna haciendo clic derecho en "Duplicar columna"
  3. "Dividir columna" por delimitador, en la pestaña Inicio. Seleccione "Cada aparición del delimitador"
  4. Ordenar cada columna Asc. de izquierda a derecha.
  5. Seleccione las columnas previamente divididas, haga clic derecho y elimine, cierre y cargue.
haga clic aquí
fuente
3

El es un delineador similar que transforma los octetos en campos de 3 dígitos que permiten una clasificación adecuada.

10.1.0.15se convierte 10001000015.

=LEFT(B85, FIND(".", B85) - 1) * 1000000000
+ MID(B85, FIND("x", SUBSTITUTE(B85, ".", "x", 1)) + 1, FIND("x", SUBSTITUTE(B85, ".", "x", 2)) - FIND(".", B85) - 1) * 1000000
+ MID(B85, FIND("x", SUBSTITUTE(B85, ".", "x", 2)) + 1, FIND("x", SUBSTITUTE(B85, ".", "x", 3)) - FIND("x", SUBSTITUTE(B85, ".", "x", 2)) - 1) * 1000
+ RIGHT(B85, LEN(B85) - FIND("x", SUBSTITUTE(B85, ".", "x", 3)))
usuario856853
fuente
3
Para que la ordenación funcione, también debe rellenar el primer octeto con ceros a la izquierda.
Blackwood
2

Como se muestra en la pregunta, la columna M son las direcciones IP (IPv4), comenzando desde M2.

Al obtener los buenos puntos de la respuesta de todos, aquí está mi solución. Solo se necesita 1 columna auxiliar. Intentamos formatear las direcciones IPv4 en 012.198.043.009formato y luego ordenarlas:

  • 12.198.43.9a 12 198 43 9, luego a012.198.043.009

  1. Formatee las direcciones IPv4 en 012.198.043.009formato ingresando N2 y llene hacia abajo:

    = TEXT( LEFT(SUBSTITUTE(M2, ".", "      "), 3    ), "000") & "."
    & TEXT(  MID(SUBSTITUTE(M2, ".", "      "), 8, 5 ), "000") & "."
    & TEXT(  MID(SUBSTITUTE(M2, ".", "      "), 15, 7), "000") & "."
    & TEXT(RIGHT(SUBSTITUTE(M2, ".", "      "), 3    ), "000")
    
  2. Ordenar por columna N


Explicación

Al poner SUBSTITUTEel punto . con 6 espacios , obtenemos lo siguiente, para que puedan extraerse correctamente:

                   |123456789|123546789|123456789|
1.1.1.1         ->  1      1      1      1
11.11.11.11     ->  11      11      11      11
111.111.111.111 ->  111      111      111      111
                    =1=    ==2==  ===3===
  • El carácter 1-3 contiene y solo contiene la primera parte.
  • El personaje 8-12 contiene y solo contiene la segunda parte.
  • El carácter 15-21 contiene y solo contiene la tercera parte.
  • Más a la derecha 3 caracteres contiene y solo contiene la cuarta parte.

Y luego, extraiga y formatee cada parte por TEXT(..., "000").

wilson
fuente
2

Si está utilizando una versión reciente de Excel en Windows, puede usar la siguiente fórmula para calcular el valor decimal de 32 bits de la dirección IP.

=SUMPRODUCT(FILTERXML("<I><o v="""&SUBSTITUTE([@ipbase],".","""/><o v=""")&"""/></I>","//o/@v"),{16777216;65536;256;1})

Luego puede ordenar utilizando el valor decimal derivado. Sustituya [@ipbase]con la ubicación de la celda de una dirección IP4 válida.

La función "FILTERXML" solo funciona en Windows, por lo que no tiene suerte si está utilizando otro sistema operativo.

Cory
fuente
0

También tengo una línea que le dará un formato IP rellenado (000,000,000,000) para la clasificación alfa.

= TEXT(MID(A1,1,FIND(".",A1)),"000") & "." &
  TEXT(MID(A1,FIND(".",A1)+1,FIND(".",A1,FIND(".",A1)+1)-1-FIND(".",A1)),"000") & "." &
  TEXT(MID(A1,FIND(".",A1,FIND(".",A1)+1)+1,FIND(".",A1,FIND(".",A1,FIND(".",A1)+1)+1)-1-FIND(".",A1,FIND(".",A1)+1)),"000") & "." &
  TEXT(MID(A1,FIND(".",A1,FIND(".",A1,FIND(".",A1)+1)+1)+1,LEN(A1)),"000")
John Homer
fuente