Сравнение модифицированных версий имен файлов, полученных с помощью VBA FileSystemObject - PullRequest
1 голос
/ 16 ноября 2011

Использование VBA со ссылкой на Microsoft Scripting Runtime. Я пытаюсь сравнить имена файлов в двух разных каталогах, чтобы определить, находится ли один и тот же файл в обоих каталогах. Однако я не ищу точного соответствия; Я хотел бы удалить определенные типы префиксов, поэтому, например, A-12234.pdf, 12234.pdf и A_ 12234.pdf следует считать равными друг другу.

Допустим, у меня есть функция stripPrefix(), которая выполняет необходимые строковые операции, чтобы изменить имя файла на версию, которую можно сравнить с другими - в предыдущем случае stripPrefix() вернул бы 12234.pdf для всех 3. Тогда я мог бы сравнить имена файлов в каталогах c:\dir1 и c:\dir2, используя следующий код:

sub findMatchFilenames()

dim fso as fileSystemObject
dim dir1 as folder
dim dir2 as folder
dim file1 as file
dim file2 as file

set fso=new fileSystemObject
set dir1=fso.getfolder("c:\dir1")
set dir2=fso.getfolder("c:\dir2")
for each file1 in dir1.files
 for each file2 in dir2.files
  if stripPrefix(file1.name)=stripPrefix(file2.name) then
   debug.print file1.name & " matches " & file2.name
  end if
 next file2
next file1

end sub

Большая проблема здесь: я вызываю stripPrefix() для тех же имен файлов в dir2 каждый раз, когда я повторяю цикл for..next file1. Я мог бы создать массивы dir1Array и dir2Array урезанных версий каждого имени файла, но, похоже, я не могу соотнести их с коллекциями Files в dir1 и dir2, поскольку коллекции Files не числовые индексы. Я знаю, потому что я пытался использовать:

Set fso = New FileSystemObject
Set folderObj = fso.GetFolder("c:\data")
fileCount = folderObj.Files.Count
For c = 1 To fileCount
    MsgBox c & " " & folderObj.Files(c).name
Next

и получил «Недопустимый вызов процедуры или аргумент» от folderObj.Files(c).name. Я полагаю, что мог бы увеличить счетчик при входе в циклы for..next и использовать счетчик для обращения к массиву, например:

'after creating arrays of stripPrefix() for dir1 and dir2
ctr1=0
for each file1 in dir1.files
 ctr2=0
 for each file2 in dir2.files
  if dir1array(ctr1)=dir2array(ctr2) then
   debug.print file1.name & " matches " & file2.name
  end if
  ctr2=ctr2+1
 next file2
 ctr1=ctr1+1
next file1

но это кажется действительно неуклюжим. Есть ли лучший способ обработать эту операцию сравнения имен файлов

Ответы [ 2 ]

1 голос
/ 16 ноября 2011

Почему бы вам не использовать подстановочные знаки с помощью DIR?

Что-то вроде (не проверено):

myFile = Dir("C:\*1234.pdf")
Do While myFile <> ""
If myFile <> "." And MyFile <> ".." Then
Msgbox myFile
End If
MyFile = Dir 
Loop

Поместите это в массив.И вы можете сделать то же самое для другого каталога, а затем сравнить два массива.

1 голос
/ 16 ноября 2011

Почему бы не сделать объект словаря из каталога 2, а затем выполнить поиск по нему, используя каталог 1. Вы можете удалить префиксы при вставке в объект словаря.

Единственная проблема в том, что у вас может не быть уникального имени в словаре

Например, A-12345 будет таким же, как A12345 после удаления префикса

...