获取元素的第N个实例

时间:2013-08-20 20:52:38

标签: excel

我的列中填充了具有路径的数据。我想得到路径中的最后一个元素,第二个元素和第一个元素。例如,对于以下数据:

\Product\Release\Iteration
\Product\Folder1\Folder2\Anotherfolder\Release2\Iteration5
\Product
\Product\Somefolder\Release3\Iteration5

我想在单元格中获得以下内容

在单元格B1:“Product”中,单元格C1:“Release”,单元格D1:“Iteration”

在单元格B2中:“Product”,单元格C2:“Release2”,单元格D2:“Iteration5”

在单元格B3中:“产品”,单元格C3:空白,单元格D3:空白

在单元格B4:“Product”中,单元格C4:“Release3”,单元格D4:“Iteration5”

获取第一个和最后一个组件很简单。我主要是努力获得倒数第二个组件(上例中的C列)。

7 个答案:

答案 0 :(得分:2)

在B1中并复制下来:

=TRIM(MID(SUBSTITUTE(A1,"\",REPT(" ",99)),99,99))

在C1中并复制下来:

=IF(LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))=2,TRIM(RIGHT(SUBSTITUTE(A1,"\",REPT(" ",99)),99)),IF(LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))>2,TRIM(LEFT(RIGHT(SUBSTITUTE(A1,"\",REPT(" ",99)),198),99)),""))

在D1中并复制下来:

=IF(OR(LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))={1,2}),"",TRIM(RIGHT(SUBSTITUTE(A1,"\",REPT(" ",99)),99)))

答案 1 :(得分:1)

假设您的数据位于ColumnA中,请使用带有\作为分隔符的文本到列来分割列B:G。假设最多8个元素,则在K1和L1中放置= B1:

=IF(AND(ISBLANK(D1),ISBLANK(C1)),"",IF(ISBLANK($D1),$C1,IF(ISBLANK(C1),"",INDIRECT("R"&ROW()&"C"&COLUMN()-COUNTBLANK($B1:$I1)-4,0))))  

将L1复制到M1,将K1:M1复制到适合的位置。

将粘贴特殊值复制到顶部并删除列A:I。

答案 2 :(得分:0)

如果您只需要将数据解析为单元格,则可以使用'\'分隔符将文本文件导入Excel。否则,您需要使用CHARINDEX()和SUBSTRING循环查找每个反斜杠的位置并解析其间的数据。

您还可以使用SSIS并使用'\'分隔符设置文本文件转换到Excel以实现自动化。使用TSQL,您需要按照我的建议循环

答案 3 :(得分:0)

这是一个使用split命令的优秀示例。您只需将|字符更改为\,然后使用循环将各个值放在所需的位置。

Break string based on a character in VBA 2010

答案 4 :(得分:0)

这应该适合你(假设你没有在你的文件名中使用*,我认为在Windows中不允许这样做):

=RIGHT(A2,LEN(A2)-FIND("*",SUBSTITUTE(A2,"\","*",(LEN(A2)-LEN(SUBSTITUTE(A2,"\","")))-1),1))

这是第二个元素。

您可以通过更改粗体数字来获取所需的任何元素:

= RIGHT(A2,LEN(A2) - 查找( “”,替代(A2, “\”, “”,(LEN(A2)-LEN(SUBSTITUTE(A2,“\ ”, “”))) - 的 3 ),1))

修改/ ADDITION

如果你想摆脱上面公式中第n个元素右边的值,你可以这样做:

=IFERROR(LEFT(RIGHT(A2,LEN(A2)-FIND("*",SUBSTITUTE(A2,"\","*",(LEN(A2)-LEN(SUBSTITUTE(A2,"\","")))-1),1)),FIND("\",RIGHT(A2,LEN(A2)-FIND("*",SUBSTITUTE(A2,"\","*",(LEN(A2)-LEN(SUBSTITUTE(A2,"\","")))-1),1)),1)-1),"error checking, lol")

答案 5 :(得分:0)

制作两个公式来检索所需路径的任何部分:

从左边开始拿第一个:

=IFERROR(MID(A3,FIND(CHAR(1),SUBSTITUTE(A3,"\",CHAR(1),C$2))+1,IFERROR(FIND("\",A3,FIND(CHAR(1),SUBSTITUTE(A3,"\",CHAR(1),C$2))+1)-FIND(CHAR(1),SUBSTITUTE(A3,"\",CHAR(1),C$2))-1,LEN(A3))),"")

从第一个开始,从右边开始:

=IFERROR(MID(A3,FIND(CHAR(1),SUBSTITUTE(A3,"\",CHAR(1),LEN(A3)-LEN(SUBSTITUTE(A3,"\",""))+1-D$2))+1,IFERROR(FIND("\",A3,FIND(CHAR(1),SUBSTITUTE(A3,"\",CHAR(1),LEN(A3)-LEN(SUBSTITUTE(A3,"\",""))+1-D$2))+1)-FIND(CHAR(1),SUBSTITUTE(A3,"\",CHAR(1),LEN(A3)-LEN(SUBSTITUTE(A3,"\",""))+1-D$2))-1,LEN(A3))),"")

here's a google spreadsheet你可以看到它是如何运作的。

注意:我必须对公式进行一些更改才能使其与google-spreadsheet兼容,即:

  • CHAR(1)更改为其他内容,我使用"/"作为替代
  • 添加IF()以检查SUBSTITUTE(,,,0)0参数),因为这会在MS Excel中出错,但不会在Google电子表格中出错。

答案 6 :(得分:0)

如果有Excel O365,则可以在B1中使用:

=TRANSPOSE(FILTERXML("<t><s>"&SUBSTITUTE(A1,"\","</s><s>")&"</s></t>","//s[position()=2 or position()>last()-2][node()]"))

可以在Excel 2013及更高版本中使用,但是它不会溢出,您需要INDEX才能从返回的数组中检索元素。看起来像这样:

=INDEX(FILTERXML("<t><s>"&SUBSTITUTE($A1,"\","</s><s>")&"</s></t>","//s[position()=2 or position()>last()-2][node()]"),COLUMN()-1)

然后向右和向下拖动。

enter image description here