Como obtenho células no Excel que contêm endereços IP para classificar corretamente?


34

Atualmente, estou trabalhando com uma grande lista de endereços IP (milhares deles).

No entanto, quando ordeno a coluna que contém os endereços IP, eles não são classificados de maneira intuitiva ou fácil de seguir.

Por exemplo, se eu inserir endereços IP da seguinte maneira:

insira a descrição da imagem aqui

E então, se eu classificar em ordem crescente, recebo o seguinte:

insira a descrição da imagem aqui

Existe uma maneira de eu formatar as células para que, por exemplo, um endereço IP 17.255.253.65 apareça após 1.128.96.254 e antes de 103.236.162.56 quando classificados em ordem crescente?

Se não, existe outra maneira de alcançar esse objetivo final?


3
A classificação não é afetada pela formatação da célula.
Blackwood

11
Isso é interessante - eu tinha certeza de que o formato de uma célula afetaria a classificação em alguns casos e pensei que talvez esse fosse um deles. Obrigado pelo esclarecimento!
Monomeeth

11
E Bruce o ajudará se algo disso precisar lidar com endereços IPv6!
Criggie

Respostas:


42

Como você deve ter percebido, seus endereços IP são tratados como texto e não como números. Eles estão sendo classificados como texto, o que significa que os endereços que começam com "162" virão antes dos endereços que começam com "20". (porque o caractere "1" vem antes do caractere "2".

Você pode usar a fórmula fornecida nesta resposta: https://stackoverflow.com/a/31615838/4424957 para dividir o endereço IP em suas partes.

Se seus endereços IP estiverem nas colunas A, adicione as colunas BE conforme mostrado abaixo.

insira a descrição da imagem aqui

Digite a fórmula

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

na célula B2 e copie-o para as colunas BE em todas as linhas para obter as quatro partes de cada endereço IP. Agora, classifique todo o intervalo pelas colunas B a E (nessa ordem), como mostrado abaixo:

insira a descrição da imagem aqui

Se você não quiser ver as colunas auxiliares (BE), poderá ocultá-las.


12
Em vez de dividir em quatro colunas, talvez seja melhor "concatenar" os bytes como first*256^3+second*256^2+third*256+fourthem uma coluna?
Ruslan

Especialmente porque os endereços IPv4 são na verdade apenas números de 32 bits. O modo de exibição de endereços IP em quatro bits de quatro bits é apenas para legibilidade humana.
Kat

@ Kat Concordo que funcionaria e requer apenas uma coluna auxiliar em vez de quatro. Mas a fórmula nessa coluna seria bastante longa, então eu escolhi usar quatro colunas (eu provavelmente as ocultaria em qualquer caso).
Blackwood

10

A solução mais fácil, em 3 etapas, posso sugerir que você é ,,,

  1. Selecione a coluna Endereço IP, aplique o comando Texto à coluna .

  2. Na coluna adjacente escreva esta fórmula

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

  3. Finalmente, classifique em ordem crescente.

Verifique a captura de tela.

insira a descrição da imagem aqui

NB:

Vermelho é o endereço IP original (na coluna A).

Verde depois de aplicar o texto à coluna (coluna B a E).

PretoDepois de concatenar e classificar (coluna F).

O motivo é muito simples: o endereço IP original é Dados de Texto e o Excel não aceita nenhum Formato de Célula para transformá-lo em Número.

Espero que isso ajude você.


4
Isso é terrível. Você nunca deseja misturar dados de diferentes linhas.
MaxW

@ MaxW ,, eu não estou recebendo exatamente o que você quer dizer !!
Clive S

2
Ele quer dizer que você deve ter incluído a coluna A original na classificação, para que os endereços iP sejam os mesmos em cada linha.
precisa

11
Não, nada de errado que eu fiz, a demanda do OP era classificar o endereço IP em ordem natural ,, (número) e a coluna A em vermelho não é classificada. A coluna F classificou o endereço IP em PRETO.
Clive S

11
+1 Esta é a solução mais fácil da página. @ RajeshS talvez mude a palavra 'ajustado' para 'adjacente' na sua resposta - pensei que você quis dizer uma das Text To Columncolunas lá. @ MaxW, o layout é apenas para demonstração. Se você deseja que o IP original seja classificado, ignore a etapa 2. Essa fórmula "VALUE (TRIM (MID (SUBSTITUTE") na resposta aceita deve ser substituída por 'Text To Columns' e o restante da resposta é essencialmente o mesmo.
mcalex

9

Aqui está uma função VBA que escrevi há algum tempo para resolver o mesmo problema. Ele gera uma versão acolchoada de um endereço IPv4 que classifica corretamente.

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

Exemplo simples:

Resultado

Resultado

Fórmulas

Fórmulas

Você pode classificar pela coluna 'Classificável' e ocultá-la.


4
Eu só quero observar que o endereço IP classificável será analisado como um endereço diferente do original (porque algum idiota escolheu interpretá-lo como octal). Portanto, use-os apenas para classificação e não os trate como IPs adequados.
CodesInChaos

Se você estiver indo para VBA puxar para fora porque não basta ter vba fazer a triagem
Richard Tingle

11
@RichardTingle 1. É de (um pouco) mais trabalho 2. eu poderia querer ordenar a lista de várias maneiras diferentes em diferentes momentos
grahamj42

7

Aqui está uma resposta que terá apenas 1 coluna da sua tabela e converterá o endereço IPv4 na numeração da base 10.

Como você está colocando seus dados na coluna "M", isso começa na célula M2 (M1 é o rótulo). Encapsulá-lo como código gera uma bagunça terrível, então usei a citação em bloco:

= INT (ESQUERDA (M2, FIND (".", M2) - 1)) * 256 ^ 3 + INT (MID (M2, FIND (".", M2) + 1, FIND (".", M2, FIND) (".", M2) + 1) - FIND (".", M2) -1)) * 256 ^ 2 + INT (MID (M2, FIND (".", M2, FIND (".", M2) + 1) + 1, FIND (".", M2, FIND (".", M2, FIND (".", M2) + 1) + 1) - FIND (".", M2, FIND ("." , M2) + 1) - 1)) * 256 + INT (DIREITA (M2, LEN (M2) - FIND (".", M2, FIND (".", M2, FIND (".", M2) + 1))) ) + 1)))

Não é exatamente a fórmula mais fácil de ler, mas você pode simplesmente copiar e colar no seu celular (de preferência N2 ou outra coisa na mesma linha do seu primeiro endereço IP). Ele pressupõe a formatação adequada do endereço IP, pois a correção de erros na fórmula tornaria ainda pior a análise humana.


3

Se você não quiser usar fórmulas ou VBA, use o Power Query. (No Excel 2016, Get & Transform, no Excel 2010 ou 2013, instale o suplemento PowerQuery para acompanhar).

  1. Traga a tabela para o editor PowerQuery.
  2. Duplique a coluna clicando com o botão direito do mouse em "Duplicar coluna"
  3. "Dividir coluna" por delimitador, na guia Página inicial. Selecione "Cada ocorrência do delimitador"
  4. Classifique cada coluna Asc. da esquerda para a direita.
  5. Selecione as colunas divididas anteriormente, clique com o botão direito do mouse e remova, feche e carregue.

3

O é um liner semelhante que transforma os octetos em campos de 3 dígitos que permitem a classificação correta.

10.1.0.15torna-se 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)))

3
Para que a classificação funcione, você também precisa preencher o primeiro octeto com zeros à esquerda.
Blackwood

2

Como mostrado na pergunta, a coluna M são os endereços IP (IPv4), começando em M2.

Ao obter os pontos positivos da resposta de todos, aqui está a minha solução. Apenas uma coluna auxiliar é necessária. Tentamos formatar os endereços IPv4 em 012.198.043.009formato e depois os classificamos:

  • 12.198.43.9para 12 198 43 9, então para012.198.043.009

  1. Formate endereços IPv4 no 012.198.043.009formato inserindo N2 e preencha para baixo:

    = 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. Classificar pela coluna N


Explicação

Ao SUBSTITUTEinserir o ponto . com 6 espaços , obtemos o seguinte, para que possam ser extraídos corretamente:

                   |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===
  • O caractere 1-3 contém e contém apenas a primeira parte.
  • O caractere 8-12 contém e contém apenas a segunda parte.
  • O caractere 15-21 contém e contém apenas a terceira parte.
  • Os 3 caracteres mais à direita contêm e contêm apenas a quarta parte.

E então, extraia e formate cada parte com TEXT(..., "000").


2

Se você estiver usando uma versão recente do Excel no Windows, poderá usar a seguinte fórmula para calcular o valor decimal de 32 bits do endereço IP.

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

Você pode classificar usando o valor decimal derivado. Substitua [@ipbase]pela localização da célula de um endereço IP4 válido.

A função "FILTERXML" funciona apenas no Windows, então você não terá sorte se estiver usando outro sistema operacional.


0

Eu também tenho um one-liner que fornecerá um IP de formato acolchoado (000.000.000.000) para a classificação 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")
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.