我目前正在处理大量IP地址(其中有数千个)。
但是,当我对包含IP地址的列进行排序时,它们的排列方式不是直观或易于遵循的。
例如,如果我输入IP地址,如下所示:
然后,如果我按升序排序,则会得到以下信息:
我是否有办法格式化单元格,例如,以升序排序时,IP地址17.255.253.65出现在 1.128.96.254 之后和103.236.162.56 之前?
如果不是,我还有另一种方法可以实现这一最终目标吗?
我目前正在处理大量IP地址(其中有数千个)。
但是,当我对包含IP地址的列进行排序时,它们的排列方式不是直观或易于遵循的。
例如,如果我输入IP地址,如下所示:
然后,如果我按升序排序,则会得到以下信息:
我是否有办法格式化单元格,例如,以升序排序时,IP地址17.255.253.65出现在 1.128.96.254 之后和103.236.162.56 之前?
如果不是,我还有另一种方法可以实现这一最终目标吗?
Answers:
您可能已经意识到,您的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),则可以隐藏它们。
first*256^3+second*256^2+third*256+fourth
一列更好?
我可以建议您最简单的3个步骤解决方案,
选择“ IP地址列”,将“ 文本应用于列”命令。
在相邻的列中写下此公式
= CONCATENATE(B3,“。”,C3,“。”,D3,“。”,E3)
最后按升序排序。
检查屏幕截图。
注意:
红色是原始IP地址(在A列中)。
将文本应用于列(列B至E)后为绿色。
应用连接和排序(列F)后为黑色。
原因很简单,最初的IP地址是文本数据,而Excel不接受任何单元格格式将其转换为数字。
希望这对您有所帮助。
Text To Column
那里的一列。@MaxW,该布局仅用于演示。如果要对原始IP进行排序,则只需忽略第2步。应将接受的答案中的大量“ VALUE(TRIM(MID(SUBSTITUTE)”公式替换为“文本到列”),其余的答案与此基本相同。
这是我前一段时间编写的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
简单的例子:
结果
公式
您可以按“可排序”列进行排序并将其隐藏。
这是一个答案,该答案仅占表的1列,并将IPv4地址转换为以10为底的编号。
由于您将数据放在“ M”列中,因此此数据从单元格M2(标签为M1)开始。将其封装为代码会带来一团糟,所以我使用了blockquote:
= INT(LEFT(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(RIGHT(M2,LEN(M2)-FIND(“。”,M2,FIND(“。”,M2,FIND(“。”,M2)+ 1 )+ 1)))
并非最容易理解的公式,但您可以将其复制并粘贴到单元格中(最好是N2或与您的第一个IP地址在同一行的其他内容)。它假定IP地址的格式正确,因为公式中的错误校正会使人为解析更糟。
是一个类似的单行代码,它将八位位组转换为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)))
如图所示,列M是从M2开始的IP地址(IPv4)。
通过从每个人的答案中获得好处,这是我的解决方案。只需要1个辅助列。我们尝试将IPv4地址012.198.043.009
格式化为format,然后对其进行排序:
12.198.43.9
到12 198 43 9
,然后到012.198.043.009
012.198.043.009
通过输入N2将IPv4地址格式化为格式,然后向下填充:
= 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")
按N列排序
通过用6个空格SUBSTITUTE
加上点,我们得到以下内容,以便可以正确提取它们:.
|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===
然后,通过提取并格式化每个部分TEXT(..., "000")
。
我还有一个内衬,可以为您提供带填充格式的IP(000.000.000.000)用于alpha排序。
= 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")