【发布时间】:2014-06-12 10:39:33
【问题描述】:
我在 PowerPivot 中导入了一个非常大的文件(800 万行),其中包含一个要拆分的地址列:
我尝试了 LEFT 和 FIND,但无法获得我想要的输出。
【问题讨论】:
标签: string excel excel-formula worksheet-function
我在 PowerPivot 中导入了一个非常大的文件(800 万行),其中包含一个要拆分的地址列:
我尝试了 LEFT 和 FIND,但无法获得我想要的输出。
【问题讨论】:
标签: string excel excel-formula worksheet-function
A1中的数据,B1中输入:
=TRIM(MID(SUBSTITUTE($A1,"#",REPT(" ",999)),COLUMNS($A:A)*999-998,999))
然后复制过去。
【讨论】:
使用# 作为分隔符的文本到列可能适合,但可能对每个结果单元格使用TRIM。
【讨论】:
鉴于现在(版本 2010+)有一个菜单命令来执行此操作,可以通过导入向导完成,VBA 函数可以轻松完成此操作,并且已发布其他解决方案,这似乎没有必要。尽管如此,这里有一种使用数组公式的替代方法。
您需要有一个标题行并在将显示分隔值的列中填充增量整数(1、2、3、...)。您需要与分隔值一样多的列。此示例中使用的分隔符是“#”。必须为公式选择第二个分隔符(示例中为“@”,但可能更好的是 CHAR(1))。
如果 Excel 具有拆分函数(如 VBA)会很理想,但它没有。
如果 Excel 有一个 FIND 函数可以找到字符的第 n 次出现,那会很方便,但它没有。
不过,Excel 确实有 SUBSTITUTE 函数,它可以对第 n 次出现的字符进行操作,然后您就可以找到该字符。因此,一个繁琐的解决方法是可能的。
=FIND("@",SUBSTITUTE($A2,"#","@",5))
将计算 $A2 中字符串中第 5 次出现分隔符“#”的字符位置。
例如
$A2 = "Hello#my#name#is#Bob#What#is#your#name?"
SUBSTITUTE($A2,"#","@",5) = "Hello#my#name#is#Bob@What#is#your#name?"
FIND("@",SUBSTITUTE($A2,"#","@",5)) = 21
为了使其更通用,请在字符串两端使用分隔符填充字符串,并使用MID 函数来隔离您想要的文本部分。使用列标题行(例如 B$1:M$1)指定哪个分隔值将出现在该列中。
=MID($A2, FIND("@",SUBSTITUTE("#" & $A2 & "#","#","@",B$1)), FIND("@",SUBSTITUTE("#" & $A2 & "#","#","@",B$1+1)) - FIND("@",SUBSTITUTE("#" & $A2 & "#","#","@",B$1)) - 1 )
您可以复制该公式,也可以先在各列中突出显示,然后键入带有标题数组范围代替 B$1 的公式(例如 B$1:F$1)并将其保存为数组公式使用 CTRL+SHIFT+ENTER。
例如,
{=MID($A2, FIND("@",SUBSTITUTE("#" & $A2 & "#","#","@",B$1:F$1)), FIND("@",SUBSTITUTE("#" & $A2 & "#","#","@",B$1:F$1+1)) - FIND("@",SUBSTITUTE("#" & $A2 & "#","#","@",B$1:F$1)) - 1 )}
假设 B1:F1 在单元格中包含 1、2、3、4、5,则将是 B2:F2 将 A2 拆分为 5 个单独的 # 分隔值的数组公式。
使用FIND 而不是SEARCH,因为SEARCH 不区分大小写并使用通配符(*、?)。
【讨论】: