我目前正在从事一个项目,该项目要求我从给定目录中的数百个电子表格中编译数据。我的问题是,我不知道如何处理不同的子修改文件。例如,文件名为:
H 210F 211对于上述文件,我只需从1c和2b读取即可。是否有一个很好的方法来确定哪些文件需要读取,或者至少有人能指出我可以查看的方向?我最初的想法是遍历文件名中的字符,并检查一个数字后面最大的字母,但这似乎是很难正确编码的。
提前感谢!
发布于 2020-05-17 18:45:33
处理这个问题的方法有很多。如果您的文件名域真正固定为R{num}{prio}.xlsx,那么请注意,当{prio}.xlsx被去掉时,文件名构成有效的{prio}.xlsx单元地址。从示例中得到的单元格地址是R1和R2。现在,您可以使用当前电子表格的R列作为稀疏向量来存储每个单元格(又名文件)所观察到的最高优先级。当检查了所有文件名并存储了它们的最高优先级时,现在只需遍历R列来获取所选的文件以进行处理。
下面是处理上述文件名域的代码..。
Sub ProcessFilesBasedOnFnamePriority()
Dim filenames, fname As Variant
Dim maxRowNum, nRowNum, i As Long
Dim strFilePrefix, strCellPrio As String
maxRowNum = 1
filenames = listfiles("c:\temp\lots_of_files")
' make an assumption that all filenames begin with the same
' single-char prefix character.
strFilePrefix = Left(filenames(1), 1)
For Each fname In filenames
Dim dotpos, suffixLen As Integer
Dim strCellAddr, strFnamePrio
dotpos = InStr(1, fname, ".")
suffixLen = Len(Mid(fname, dotpos))
' assume priority is specified by a single char in fname
strFnamePrio = LCase(Mid(fname, dotpos - 1, 1))
strCellAddr = Left(fname, Len(fname) - (suffixLen + 1)) ' "+1" to account for priority char
strCellPrio = Range(strCellAddr)
If (Trim(strCellPrio) = "") Then
Range(strCellAddr) = strFnamePrio ' store first prio occurrence
Else
' assume filename prio characters (e.g., [a-z]) sort lexicographically
If strFnamePrio > strCellPrio Then
Range(strCellAddr) = strFnamePrio
End If
End If
nRowNum = CLng(Mid(strCellAddr, 2))
If nRowNum > maxRowNum Then
maxRowNum = nRowNum
End If
Next
For i = 1 To maxRowNum
strCellPrio = Trim(Range(strFilePrefix & CStr(i)))
If strCellPrio <> "" Then
fname = strFilePrefix & CStr(i) & strCellPrio & ".xlsx"
Debug.Print fname ' <-- do analysis on fname
End If
Next i
End Sublistfiles的代码是here。请注意,此解决方案将而不是处理不符合假定命名模式的丢失文件。你需要加些支票才能把它们清除掉。
发布于 2020-05-15 20:03:00
可以将需要匹配的部分文件名列表存储在数组中。然后循环遍历数组中的部分名称并预置部分名称,循环遍历目录以查找匹配项。VBA提供了InStr函数,您可以用来测试文件名是否包含数组中的部分名称。
伪码:
myArray = [ 1c, 2b]
ForEach partialName in myArray
ForEach file in myDirectory
If InStr(fileName, partialName) Then
// Do something interesting
End If
Next file
Next partialName发布于 2020-05-17 19:03:12
使用excel工作表或表格格式来表示所需的文件。
excel工作表只需要两列,A表示文件名而没有子修订,B列表示所需的子修订。
编译和组合这些信息,然后vba实现使用excel工作表/表格格式来迭代和读取这些文件。
使用任何语言来组成表格格式(在我的例子中,python是首选的),并尝试使用任何您可以“确定子修订”的东西。
这使您可以更容易地调试结果,并使用任何语言来编译格式化或表格分隔的文件。
https://stackoverflow.com/questions/61826568
复制相似问题