Помеченные папки в тестовых и обучающих данных и сортировка данных в них на основе метки - PullRequest
0 голосов
/ 26 января 2019

Я хочу обучить классификатор изображений CoreML, и для этого требуется наличие папки для каждой метки в тестовых и обучающих данных и помещение данных с этой меткой в ​​правильную папку. У меня есть структура папок, как это:

Train
 -1
 -2
 -3
 -4
Test
 -1
 -2
 -3
 -4

У меня уже есть данные тестов и тренировок, но данные не разбиты на классы.

И у меня есть файл Excel CSV, где начало выглядит так.

first few rows

С структурированными именами изображений 10_left.jpeg, 10_right.jpeg, 13_left.jpeg и т. Д.

Имеется более 15 000 изображений, поэтому делать это вручную не лучше. Есть ли способ переместить файлы в правильную папку на основе имени метки в VBA в Excel? Или как-то иначе? Спасибо!

Edit: Основываясь на ответе ниже, я попробовал это:

Option Explicit
Dim iRow


Sub SaveFilesToFolders()

Dim Folder0 As String, Folder1 As String, Folder2 As String, Folder3 As String, Folder4 As String
Dim FileNameRange As Range
Dim actCell As Range
Dim SelFolder As Integer
Dim ActFileName As String

    Folder0 = "/Volumes/G-DRIVE\ mobile\ USB-C/trainDataInClasses/0"
    Folder1 = "/Volumes/G-DRIVE\ mobile\ USB-C/trainDataInClasses/1"
    Folder2 = "/Volumes/G-DRIVE\ mobile\ USB-C/trainDataInClasses/2"
    Folder3 = "/Volumes/G-DRIVE\ mobile\ USB-C/trainDataInClasses/3"
    Folder4 = "/Volumes/G-DRIVE\ mobile\ USB-C/trainDataInClasses/4"

    Set FileNameRange = Range("A2:A21")


    For Each actCell In FileNameRange
        'Debug.Print actCell.Address
        ActFileName = actCell.Value
        SelFolder = actCell.Offset(0, 1).Value
        Select Case SelFolder
            Case 0
                Call Save2Folder(ActFileName, Folder0)
            Case 1
                Call Save2Folder(ActFileName, Folder1)
            Case 2
                Call Save2Folder(ActFileName, Folder2)
            Case 3
                Call Save2Folder(ActFileName, Folder3)
            Case 4
                Call Save2Folder(ActFileName, Folder4)
        End Select
    Next actCell


End Sub

'Sub Save2Folder() '(locFileName As String, FolderStr As String)
Sub Save2Folder(locFileName, FolderStr)
    Dim Po15k As String 'Path to the 15k Files
    Po15k = "/Volumes/G-DRIVE\ mobile\ USB-C/resortTrainFirst24 "

    FileCopy Po15k & locFileName & ".jpg", FolderStr & locFileName & ".jpg"
End Sub

Но появилась ошибка "Путь не найден" Есть предложения?

1 Ответ

0 голосов
/ 27 января 2019
Option Explicit
Dim iRow

Sub InitSampleData()
    Range("B1") = "10_left"
    Range("B2") = "10_right"
    Range("B3") = "13_left"
    Range("B4") = "13_right"
    Range("B5") = "13_left"
    Range("B6") = "13_right"

    Range("C1") = 0
    Range("C2") = 0
    Range("C3") = 1
    Range("C4") = 1
    Range("C5") = 2
    Range("C6") = 4
End Sub

Sub SaveFilesToFolders()

Dim Folder0 As String, Folder1 As String, Folder2 As String, Folder3 As String, Folder4 As String
Dim FileNameRange As Range
Dim actCell As Range
Dim SelFolder As Integer
Dim ActFileName As String

    Folder0 = "C:\temp\xxx\MySpecialFolder0\"
    Folder1 = "C:\temp\xxx\MySpecialFolder1\"
    Folder2 = "C:\temp\xxx\MySpecialFolder2\"
    Folder3 = "C:\temp\xxx\MySpecialFolder3\"
    Folder4 = "C:\temp\xxx\MySpecialFolder4\"

    'Set FileNameRange = Range("B2:B15001")
    Set FileNameRange = Range("B1:B6")

    For Each actCell In FileNameRange
        'Debug.Print actCell.Address
        ActFileName = actCell.Value
        SelFolder = actCell.Offset(0, 1).Value
        Select Case SelFolder
            Case 0
                Call Save2Folder(ActFileName, Folder0)
            Case 1
                Call Save2Folder(ActFileName, Folder1)
            Case 2
                Call Save2Folder(ActFileName, Folder2)
            Case 3
                Call Save2Folder(ActFileName, Folder3)
            Case 4
                Call Save2Folder(ActFileName, Folder4)
        End Select
    Next actCell


End Sub

'Sub Save2Folder() '(locFileName As String, FolderStr As String)
Sub Save2Folder(locFileName, FolderStr)
    Dim Po15k As String 'Path to the 15k Files
    'Po15k = "C:\MyFolderWith15000Files\"
    Po15k = "C:\temp\xxx\"
    FileCopy Po15k & locFileName & ".jpg", FolderStr & locFileName & ".jpg"
End Sub

'With the below routines you can get a listing of your 15000 files.
'Or you can check the destination folders.
'You need to add "Microsoft Scripting Runtime" via IBE Menu "Tools - References"

Sub ListFiles()
    ThisWorkbook.Worksheets.Add
    On Error Resume Next
    ActiveSheet.Name = "ListOf_15000_Files"
    On Error GoTo 0
    Call ListMyFiles("C:\MyFolderWith15000Files\", IncludeSubfolders:=False)
End Sub

Sub ListMyFiles(mySourcePath, IncludeSubfolders)
Dim MyObject, mySource, myFile, mySubFolder
Dim iCol As Integer, iRow As Integer

    Set MyObject = New Scripting.FileSystemObject
    Set mySource = MyObject.GetFolder(mySourcePath)
    On Error Resume Next
    For Each myFile In mySource.Files
        iCol = 2
        Cells(iRow, iCol).Value = myFile.Path
        iCol = iCol + 1
        Cells(iRow, iCol).Value = myFile.Name
        iCol = iCol + 1
        Cells(iRow, iCol).Value = myFile.Size
        iRow = iRow + 1
    Next
    If IncludeSubfolders Then
        For Each mySubFolder In mySource.SubFolders
            Call ListMyFiles(mySubFolder.Path, True)
        Next
    End If
End Sub
...