我是一名精通多种语言的程序员,但不知为何我从未学过 Excel 宏或公式语言。我相信一定有一个简单的方法可以做到这一点,但我却不知所措。
我有一列文件名如下:
/home/www/shoppermarketexpo/dot/uploads/10DOT_33A_1275_1308304857_1.jpg
/home/www/shoppermarketexpo/dot/uploads/10DOT_15G_1184_1.jpg
/home/www/shoppermarketexpo/dot/uploads/10DOT_5A_1450_1.jpg
/home/www/shoppermarketexpo/dot/uploads/10DOT_18A_1341_1308325044_2.jpg
我需要做的是返回文件名,根据下划线将其分成几个部分。如果这需要多个步骤,我没问题 - 即公式 1 返回带有 的列10DOT_33A_1275_1308304857
,然后公式 2 使用该结果返回带有 的第二列,10DOT_33A_1275
依此类推。我希望有一个类似于 PHP 的explode 函数,您可以在其中获取字符串并根据分隔符(在本例中为下划线)返回数组。我猜这在公式中是不可能的;我可以使用 VBA,虽然我在 Mac 上,不知道它是否可用。
我知道 MID、LEFT 和 RIGHT,但它们都依赖于您知道要返回的字符数,而在本例中我不知道。每行都不同;唯一可行的标准是在下划线处将文件名拆分为多列。
这可能吗?
答案1
您可以使用数据菜单下的 Excel 文本到列功能。
这将需要几次传递,但您无需公式或 vba 即可完成。
您可以指定自己的分隔符。因此您可以选择.
分隔扩展名,然后/
分割目录结构。然后您可以选择_
分割文件名。
Nb 您可以设置不同的列以Text
避免 Excel 将它们视为数字,或者设置其他列以便Do not import (skip)
将其删除。
答案2
这是一个基于 VBA 的解决方案。请注意,像这样循环遍历单元格效率不高。如果你有很多行(比如说超过几万行),那么有更好的方法
选择要处理的范围并运行此
Sub SplitText()
Dim rng As Range, rw As Range
Dim cl As Range
Dim i As Long, j As Long, k As Long
Dim str As String
If Not TypeName(Selection) = "Range" Then Exit Sub
Set rng = Selection
For Each rw In rng.Rows
str = rw.Cells(1, 1)
str = Mid(str, InStrRev(str, "/") + 1)
str = Left(str, InStr(str, "."))
j = InStr(str, "_")
k = 2
Do While j > 0
rw.Cells(1, k) = Left(str, j - 1)
str = Mid(str, j + 1)
j = InStr(str, "_")
k = k + 1
Loop
rw.Cells(1, k) = str
Next
End Sub
答案3
这是一个基于公式的解决方案:
假设数据在 A 列,从第 2 行开始
,最多返回 5 个数据(可以进行调整以应对更多数据)
,并且字符串不包含 | 或 @(如果包含,请使用其他字符)
单元格 B2,获取文件名
=RIGHT(A2,LEN(A2)-FIND("|",SUBSTITUTE(A2,"/","|",LEN(A2)-LEN(SUBSTITUTE(A2,"/","")))))
单元格 C2,删除 .extension
=LEFT(B2,FIND(".",B2)-1)
单元格 D2:H2 作为数组公式,用 | 和 @ 括住连续项
=SUBSTITUTE(SUBSTITUTE("_"&C2&"_","_","|",{1,2,3,4,5}),"_","@",{1,2,3,4,5})
单元格 I2,然后将 I2 复制到 J2:L2:结果
=IFERROR(MID(D2,FIND("|",D2)+1,FIND("@",D2)-FIND("|",D2)-1),"")
答案4
VBA 中有一个 Split 函数可以帮助您制定计划,但没有 SPLIT 公式。
不过,我建议使用 Excel 公式。以下是几种情况:
如果每个文件的文件路径相同,只需将 RIGHT 与 LEN 和 FIND 一起使用,如下所示:
=RIGHT(A1,LEN(A1)-FIND("上传/",A1)-LEN("上传/")+1)
其中 A1 是包含文件路径的单元格。
如果所有文件的路径不相同,那么您必须使用其他方法。也许所有文件都是 .jpg (?) 或者除了文件扩展名之前没有句点。