Як я можу отримати комірки в Excel, які містять IP-адреси, щоб правильно сортувати?


34

Зараз я працюю з великим списком IP-адрес (їх тисячі).

Однак, коли я сортую стовпчик, що містить IP-адреси, вони не сортуються інтуїтивно зрозумілим або простим для наслідування.

Наприклад, якщо я введіть IP адреси таким чином:

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

І тоді, якщо я сортую у порядку зростання, я отримую це:

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

Чи є у мене спосіб відформатувати комірки, щоб, наприклад, IP-адреса 17.255.253.65 з'явилася після 1.128.96.254 та раніше 103.236.162.56 при сортуванні у порядку зростання?

Якщо ні, чи є інший спосіб для мене досягти цієї кінцевої мети?


3
Форматування комірок не залежить від сортування.
Блеквуд

1
Це цікаво - я був майже впевнений, що формат комірки в деяких випадках вплине на сортування і подумав, що, можливо, це одне із таких. Дякуємо за роз’яснення!
Мономет

1
І Брюс допоможе вам, якщо будь-що з цього потрібно обробляти IPv6 адресами!
Criggie

Відповіді:


42

Як ви, можливо, зрозуміли, ваші IP-адреси трактуються як текст, а не цифри. Вони сортуються як текст, а це означає, що адреси, що починаються з "162", прийдуть до адрес, що починаються з "20." (тому що символ "1" стоїть перед символом "2".

Ви можете використовувати формулу, надану у цій відповіді: https://stackoverflow.com/a/31615838/4424957, щоб розділити IP-адресу на її частини.

Якщо ваші IP-адреси є у стовпцях А, додайте стовпці BE, як показано нижче.

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

Введіть формулу

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

у комірці В2 та скопіюйте її у стовпці BE у всіх рядках, щоб отримати чотири частини кожної IP-адреси. Тепер сортуйте весь діапазон за стовпцями від B до E (у тому порядку), як показано нижче:

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

Якщо ви не хочете бачити стовпчики помічників (BE), їх можна приховати.


12
Замість того, щоб розбиватись на чотири стовпці, може, краще було б "об'єднати" байти, як first*256^3+second*256^2+third*256+fourthв одному стовпчику?
Руслан

Тим більше, що адреси IPv4 - це фактично 32-бітні числа. Чотири 4-бітові способи відображення IP-адрес призначені виключно для людської читабельності.
Кет

@Kat Я погоджуюся, що це спрацює, і для цього потрібна лише одна стовпець помічника замість чотирьох. Але формула в цьому одному стовпчику була б досить довгою, тому я вирішив використовувати чотири стовпці (я, мабуть, приховав би їх у будь-якому випадку).
Блеквуд

10

Найпростіший, 3 етапи Рішення, яке я можу запропонувати вам, ,,,

  1. Виберіть Стовпець IP-адреси, застосуйте команду Текст до стовпця .

  2. У сусідній колоні напишіть цю формулу

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

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

Перевірте знімок екрана.

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

Примітка:

Червоний - оригінальна IP-адреса (у колонці A).

Зелений після нанесеного тексту до стовпця (стовпчик B до E).

Чорний колір застосовується після конкатенату та сортування (стовпець F).

Причина дуже проста, спочатку IP-адреса - це текстові дані, а Excel не приймає жодного формату комірок, щоб перетворити його на номер.

Сподіваюся, це допоможе тобі.


4
Це жахливо. Ніколи не хочеться змішувати дані з різних рядків.
MaxW

@MaxW ,, Я не отримую саме те, що ти хочеш сказати !!
Раджеш S

2
Він означає, що ви мали б включити оригінальну колонку A у сортування, тож IP-адреси були б однаковими у кожному рядку.
Bandersnatch

1
Ні,, нічого поганого я не зробив, - вимога ОП полягала в сортуванні ІР-адреси в природному порядку, (Кількість), а стовпець А в ЧЕРВОНІ відсортований. У стовпці F відсортовано IP-адресу в чорному кольорі.
Раджеш S

1
+1 Це найпростіше рішення на сторінці. @RajeshS, можливо, у своїй відповіді змінить слово "скориговано" на "сусіднє" - я подумав, що ви мали на увазі одну зі Text To Columnстовпців. @MaxW, макет призначений лише для демонстрації. Якщо ви хочете, щоб оригінальний IP-файл відсортований, просто ігноруйте крок 2. Ця масивна формула "VALUE (TRIM (MID (SIDSTITUTE") у прийнятій відповіді) повинна бути замінена на "Text To Column" ("Текст до стовпців"), а решта відповіді по суті така сама.
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-адреса буде розбиратися як інша адреса від початкової (тому що якийсь ідіот вирішив інтерпретувати їх як восьмеричний). Тому використовуйте їх лише для сортування та не сприймайте їх як належні ІР.
CodesInChaos

Якщо ви збираєтеся витягнути vba, чому б не просто вба зробити сортування
Річард Тінгл

1
@RichardTingle 1. Це (трохи) більше роботи 2. Я, можливо, захочу сортувати список кількома різними способами в різні моменти
grahamj42

7

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

Оскільки ви вводите свої дані у стовпчик "M", це починається з комірки M2 (M1 є міткою). Інкапсуляція його як коду створює один жахливий безлад, тому я використав блокчету:

= 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) - FIND (".", M2, FIND (".", M2, FIND (".", M2) + 1 ) + 1)))

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


3

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

  1. Перенесіть таблицю в редактор PowerQuery.
  2. Скопіюйте стовпець, натиснувши правою кнопкою миші "Скопіювати стовпець"
  3. "Розділити стовпчик" роздільником, на вкладці "Головна". Виберіть "Кожне виникнення роздільника"
  4. Сортуйте кожен стовпець за урахуванням. зліва направо.
  5. Виберіть попередньо розділені стовпці, клацніть правою кнопкою миші та видаліть, закрийте та завантажте.

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


Пояснення

Використовуючи 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-файл із форматом 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.