Как получить ячейки в Excel, которые содержат IP-адреса для правильной сортировки?


34

В настоящее время я работаю с большим списком IP-адресов (их тысячи).

Однако, когда я сортирую столбец, содержащий IP-адреса, они не сортируются интуитивно понятным или простым способом.

Например, если я введу IP-адреса следующим образом:

введите описание изображения здесь

И тогда, если я сортирую в порядке возрастания, я получаю это:

введите описание изображения здесь

Можно ли отформатировать ячейки так, чтобы, например, IP-адрес 17.255.253.65 появлялся после 1.128.96.254 и до 103.236.162.56 при сортировке в порядке возрастания?

Если нет, есть ли другой способ для меня достичь этой конечной цели?


3
На сортировку не влияет форматирование ячеек.
Блэквуд

1
Это интересно - я был почти уверен, что формат ячейки повлияет на сортировку в некоторых случаях, и подумал, что это может быть одним из них. Благодарю за разъяснение!
Мономет

1
И Брюс поможет вам, если что-то из этого потребуется для обработки адресов IPv6!
Кригги

Ответы:


42

Как вы, возможно, поняли, ваши IP-адреса рассматриваются как текст, а не как числа. Они сортируются как текстовые, что означает, что адреса, начинающиеся с «162», будут предшествовать адресам, начинающимся с «20». (потому что символ «1» предшествует символу «2».

Вы можете использовать формулу, представленную в этом ответе: https://stackoverflow.com/a/31615838/4424957, чтобы разделить IP-адрес на его части.

Если ваши IP-адреса находятся в столбцах A, добавьте столбцы BE, как показано ниже.

введите описание изображения здесь

Введите формулу

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

в ячейке B2 и скопируйте его в столбцы BE во всех строках, чтобы получить четыре части каждого IP-адреса. Теперь рассортируйте весь диапазон по столбцам от B до E (в указанном порядке), как показано ниже:

введите описание изображения здесь

Если вы не хотите видеть вспомогательные столбцы (BE), вы можете их скрыть.


12
Вместо разделения на четыре столбца, может быть, было бы лучше «объединить» байты, как first*256^3+second*256^2+third*256+fourthв одном столбце?
Руслан

Тем более, что адреса IPv4 на самом деле являются просто 32-битными числами. Четырехразрядный способ отображения IP-адресов предназначен исключительно для удобства чтения.
Kat

@Kat Я согласен, что это сработает, и для этого требуется только один вспомогательный столбец вместо четырех. Но формула в этом одном столбце будет довольно длинной, поэтому я решил использовать четыре столбца (я, вероятно, скрыл бы их в любом случае).
Blackwood

10

Самое простое, трехэтапное решение, которое я могу предложить вам ,,,

  1. Выберите столбец IP-адрес, примените текст к столбцу команду « .

  2. В соседней колонке напишите эту формулу

    = СЦЕПИТЬ (В3, "", С3, "", D3, "", Е3)

  3. Наконец сортировка в порядке возрастания.

Проверьте снимок экрана.

введите описание изображения здесь

NB:

красный - это оригинальный IP-адрес (в столбце A).

зеленый после применения текста к столбцу (столбец от B до E).

черныйПосле нанесения цвета происходит конкатенация и сортировка (столбец F).

Причина заключается в том, что изначально IP-адрес очень прост: текстовые данные, и Excel не принимает формат ячейки, чтобы превратить его в номер.

Надеюсь, это поможет вам.


4
Это ужасно Вы никогда не хотите смешивать данные из разных строк.
MaxW

@MaxW ,, я не понимаю, что ты хочешь сказать !!
Раджеш С

2
Он означает, что вы должны были включить исходный столбец A в сортировку, чтобы адреса iP были одинаковыми в каждой строке.
Bandersnatch

1
Нет ,, ничего плохого я не сделал ,, требование ОП состояло в том, чтобы отсортировать IP-адрес в естественном порядке ,, (число), а столбец А в КРАСНОМ не отсортирован. Столбец F имеет отсортированный IP-адрес в черном цвете.
Раджеш С

1
+1 Это самое простое решение на странице. @RajeshS, возможно, измените слово «скорректированный» на «соседний» в вашем ответе - я думал, что вы имели в виду один из Text To Columnстолбцов там. @MaxW, макет только для демонстрации. Если вы хотите, чтобы исходный IP-адрес был отсортирован, просто пропустите шаг 2. Эту массивную формулу «VALUE (TRIM (MID (SUBSTITUTE») в принятом ответе следует заменить на «Текст в столбцы», а остальная часть ответа по сути такая же, как эта.
mcalex

9

Вот функция VBA, которую я написал некоторое время назад для решения той же проблемы. Он генерирует версию IPv4-адреса с добавками, которая сортируется правильно.

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

Простой пример:

Результат

Результат

Формулы

Формулы

Вы можете отсортировать по столбцу «Сортируемый» и скрыть его.


4
Я просто хочу отметить, что сортируемый IP-адрес будет анализироваться как отличный от исходного (потому что какой-то идиот решил интерпретировать его как восьмеричный). Так что используйте их только для сортировки и не рассматривайте их как надлежащие IP-адреса.
CodesInChaos

Если вы собираетесь вытащить vba, почему бы просто не выполнить сортировку vba
Richard Tingle

1
@RichardTingle 1. Это (немного) больше работы 2. Я мог бы хотеть отсортировать список несколькими различными способами в разные моменты
grahamj42

7

Вот ответ, который займет только 1 столбец вашей таблицы и преобразует адрес IPv4 в нумерацию с основанием 10.

Поскольку вы помещаете свои данные в столбец «M», это начинается в ячейке M2 (метка M1). Инкапсуляция в виде кода дает один ужасный беспорядок, поэтому я использовал blockquote:

= INT (ВЛЕВО (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 (ВПРАВО (M2, LEN (M2) - НАЙТИ (".", M2, НАЙТИ (".", M2, НАЙТИ (".", M2) + 1 ) + 1)))

Не совсем легко читаемая формула, но вы можете просто скопировать и вставить в свою ячейку (предпочтительно N2 или что-то еще в той же строке, что и ваш первый IP-адрес). Это предполагает правильное форматирование IP-адреса, так как исправление ошибок в формуле сделает его еще хуже при разборе человеком.


3

Если вы не хотите использовать формулы или VBA, используйте Power Query. (В Excel 2016, Get & Transform, в Excel 2010 или 2013 установите надстройку PowerQuery, чтобы следовать ей).

  1. Перенесите таблицу в редактор PowerQuery.
  2. Дублируйте столбец, щелкнув правой кнопкой мыши «Дублировать столбец»
  3. «Разделить столбец» разделителем на вкладке «Главная». Выберите «Каждое вхождение разделителя»
  4. Сортировать каждый столбец Asc. слева направо.
  5. Выберите ранее разделенные столбцы, щелкните правой кнопкой мыши и удалите, закройте и загрузите.

3

Это похожая строка, которая преобразует октеты в 3-значные поля, что позволяет выполнять надлежащую сортировку.

10.1.0.15становится 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
Чтобы сортировка работала, вы должны также дополнить первый октет начальными нулями.
Блэквуд

2

Как показано в вопросе, в столбце M указаны IP-адреса (IPv4), начиная с M2.

Получив хорошие ответы от каждого, вот мое решение. Требуется только 1 вспомогательный столбец. Мы пытаемся отформатировать адреса IPv4 в 012.198.043.009формат, а затем отсортировать их:

  • 12.198.43.9чтобы 12 198 43 9потом012.198.043.009

  1. Отформатируйте адреса IPv4 в 012.198.043.009формат, введя в N2 , и заполните вниз:

    = 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. Сортировать по столбцу N


Explaination

С SUBSTITUTEпомощью точки . с 6 пробелами мы получаем следующее, чтобы их можно было правильно извлечь:

                   |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===
  • Символ 1-3 содержит и содержит только первую часть.
  • Символ 8-12 содержит и содержит только вторую часть.
  • Символ 15-21 содержит и содержит только третью часть.
  • Самые правые 3 символа содержат и содержат только четвертую часть.

А затем, извлеките и отформатируйте каждую часть TEXT(..., "000").


2

Если вы используете последнюю версию Excel в Windows, вы можете использовать следующую формулу для вычисления 32-разрядного десятичного значения IP-адреса.

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

Затем вы можете сортировать, используя производное десятичное значение. Замените [@ipbase]ячейкой действительный адрес IP4.

Функция «FILTERXML» работает только в Windows, поэтому вам не повезло, если вы используете другую операционную систему.


0

У меня также есть одна строка, которая даст вам IP в мягком формате (000.000.000.000) для альфа-сортировки.

= 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")
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.