对于网站,我尝试使用VBA / Powershell和/或CSV文件格式化大约5000个文件名:
这些文件目前的文件名如下: blabla_45359_blabla.jpg 和 45359 - blabla.jpg 其中45359是我们网上商店中商品的ID。 我想格式化这些文件名,因为只有ID才是文件名...所以: 45359.jpg
我尝试在Excel中创建一个显示所有当前文件名的列表,并尝试通过自动过滤掉ID部分来格式化它们,但没有任何成功。
任何提示?
编辑:示例
这实际上取决于文件名,例如我有一个名为的文件:Futterklappe_PrimoLux_60_schwarz_93412_f.jpg 目标是自动将此文件重命名为:93412.jpg
我有一个所有ID的列表,但如果文件名中的某个ID匹配,则应将这些文件重命名为其中一个ID。上面也有一些例外,因为有些文件名会出现多个ID,因此我必须复制这些文件并为每个ID重命名。
答案 0 :(得分:1)
基于regex的用户定义函数或UDF似乎是最好的工作表方法。
Option Explicit
Function fixFilename(str As String, ndx As Integer) As String
Dim tmp As String, ext As String
Static cmat As Object, regex As Object
If regex Is Nothing Then
Set regex = CreateObject("VBScript.RegExp")
With regex
.Global = True
.MultiLine = False
.IgnoreCase = True
End With
Else
Set cmat = Nothing
End If
With regex
.Pattern = "\d{5}"
If regex.Test(str) Then
Set cmat = .Execute(str)
If ndx <= cmat.Count Then _
tmp = cmat.Item(ndx - 1)
End If
End With
ext = Mid(str, InStrRev(str, Chr(46)))
If CBool(Len(tmp)) Then _
fixFilename = tmp & ext
End Function
在下面的示例图像中,B5已填充到C5以收集第二个ID。
答案 1 :(得分:1)
在PowerShell中,我只使用带有捕获组的正则表达式:
Get-ChildItem -Path $Path -File |
ForEach-Object {
if ($_.Name -match '(?<ID>\d{5})') {
$NewName = $Matches.ID + $_.Extension
$_ | Rename-Item -NewName $NewName
}
}