【问题标题】:Splitting text columns拆分文本列
【发布时间】:2014-06-12 10:39:33
【问题描述】:

我在 PowerPivot 中导入了一个非常大的文件(800 万行),其中包含一个要拆分的地址列:

我尝试了 LEFT 和 FIND,但无法获得我想要的输出。

【问题讨论】:

    标签: string excel excel-formula worksheet-function


    【解决方案1】:

    A1中的数据,B1中输入:

    =TRIM(MID(SUBSTITUTE($A1,"#",REPT(" ",999)),COLUMNS($A:A)*999-998,999))
    

    然后复制过去。

    【讨论】:

    • 非常感谢。
    【解决方案2】:

    使用# 作为分隔符的文本到列可能适合,但可能对每个结果单元格使用TRIM。

    【讨论】:

      【解决方案3】:

      鉴于现在(版本 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 不区分大小写并使用通配符(*、?)。

      【讨论】:

      • 很好的解释!
      • 致审稿人:我通过添加 -1 对其进行了编辑,因为我相信没有它提供的解决方案将不起作用!
      猜你喜欢
      • 1970-01-01
      • 2016-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多