AJUDA - ALGORITMO PARA ORDENA?ÃO DE ARQUIVOS
Boa tarde a todos,
Estou precisando de um algoritimo/função que ordene arquivos em um diretorio e de acrodo com sua nomeclatura, possa renomea-los em ordem númeria....kk
Vou explicar melhor:
1 - os arquivos seguem esta nomecaltura;
159309700_0001.dat
159309700_0002.dat
..
159309700_0010.dat
2 - neste diretorio as vezes falta um arquivo, exemplo;
159309700_0001.dat
159309700_0002.dat
159309700_0004.dat --> pulou, não existe 0 arquivo com final 0003.dat
..
159309700_0010.dat
3 - Assim, teriamos 10 arquivos dat, mas devemos renomear o 159309700_0004.dat para 159309700_0003.dat, entenderam ?
E o resto renomear, pois não são mais 10, e sim 9 arquivos no diretorio.
E se tiver outrso na sequencia faltando ? como o 0007 e o 0009 ?
Quem puder ajudar, desde já agradeço.
[]s
Estou precisando de um algoritimo/função que ordene arquivos em um diretorio e de acrodo com sua nomeclatura, possa renomea-los em ordem númeria....kk
Vou explicar melhor:
1 - os arquivos seguem esta nomecaltura;
159309700_0001.dat
159309700_0002.dat
..
159309700_0010.dat
2 - neste diretorio as vezes falta um arquivo, exemplo;
159309700_0001.dat
159309700_0002.dat
159309700_0004.dat --> pulou, não existe 0 arquivo com final 0003.dat
..
159309700_0010.dat
3 - Assim, teriamos 10 arquivos dat, mas devemos renomear o 159309700_0004.dat para 159309700_0003.dat, entenderam ?
E o resto renomear, pois não são mais 10, e sim 9 arquivos no diretorio.
E se tiver outrso na sequencia faltando ? como o 0007 e o 0009 ?
Quem puder ajudar, desde já agradeço.
[]s
Vamos lá, não vou entrar em méritos de algoritmos de ordenação aqui... existem muitos... bubble sort, insert sort, quick sort... e por aà vai. Como essa ordenação tem poucos itens, não vamos ficar quebrando a cabeça pra definir algoritmo mais rápido... vamos no B-A-BA.
Você sabe que a nomenclatura segue o padrão:
159309700_0001.dat
Primeiro passo é dividir o item em duas partes: antes do underline e depois do underline. (Pra isso, você pode usar split)
A partir do momento que você tem o primeiro termo, pode percorrer todos os outros arquivos com a função Dir() e verificando se possuem o prefixo igual.
Se possuir, adiciona pra sua lista de ordenação referente a esse prefixo (1593...). Na hora de ordenar, você vai fazer uso do segundo valor gerado pela função split (0001). Use um Val() ai e trate como numérico, vai ficar mais simples. Na hora de adicionar, você já adiciona ele na posição certa (onde ele é maior que o valor anterior e menor que o valor posterior).
A partir do momento que você não possui mais nada para adicionar. Você terá uma lista ordenada. AÃ basta substituir o valor pelo seu index na hora de renomear.
Exemplo:
Index Valor
1 0001
2 0003
3 0005
Abraços!
Você sabe que a nomenclatura segue o padrão:
159309700_0001.dat
Primeiro passo é dividir o item em duas partes: antes do underline e depois do underline. (Pra isso, você pode usar split)
A partir do momento que você tem o primeiro termo, pode percorrer todos os outros arquivos com a função Dir() e verificando se possuem o prefixo igual.
Se possuir, adiciona pra sua lista de ordenação referente a esse prefixo (1593...). Na hora de ordenar, você vai fazer uso do segundo valor gerado pela função split (0001). Use um Val() ai e trate como numérico, vai ficar mais simples. Na hora de adicionar, você já adiciona ele na posição certa (onde ele é maior que o valor anterior e menor que o valor posterior).
A partir do momento que você não possui mais nada para adicionar. Você terá uma lista ordenada. AÃ basta substituir o valor pelo seu index na hora de renomear.
Exemplo:
Index Valor
1 0001
2 0003
3 0005
Abraços!
Acho que sei qual vai ser a próxima pergunta...
Obrigado pela ajuda.
O problema é que o 0003 será neste caso 0002, e o 0005 será 0003, espero que tenha entendido.
Assim tenho que reordenar os arquivos, mas também renomealos para que fiquem em sequência numérica crescente.
Verei se posto um codigo do para esta rotina.
Fico no aguardo.
O problema é que o 0003 será neste caso 0002, e o 0005 será 0003, espero que tenha entendido.
Assim tenho que reordenar os arquivos, mas também renomealos para que fiquem em sequência numérica crescente.
Verei se posto um codigo do para esta rotina.
Fico no aguardo.
Sim, basta fazer como falei.
Tendo a lista, ordenada como mencionei, você terá seu collection assim:
Index Valor
1 0001
2 0003
3 0005
Isso significa que o 0003 ficará como 0002 (o index dele), 0005 ficará como 0003(o index dele).
Manjou?
Abraços!
Tendo a lista, ordenada como mencionei, você terá seu collection assim:
Index Valor
1 0001
2 0003
3 0005
Isso significa que o 0003 ficará como 0002 (o index dele), 0005 ficará como 0003(o index dele).
Manjou?
Abraços!
Entendi,
Irei realizar uns testes aqui, e tentarei renomea-los no final, de acrodo com o index.
Valeu.
Irei realizar uns testes aqui, e tentarei renomea-los no final, de acrodo com o index.
Valeu.
Amigos,
Consegui, segue a rotina utilizada, espero que ajuda a todos, pois utilizei a experiência e dica do nosso amigo DS2T.
Se precisarem de mais informação e só pedir.
Valeu!
Consegui, segue a rotina utilizada, espero que ajuda a todos, pois utilizei a experiência e dica do nosso amigo DS2T.
[ô] Data: 22/10/2015
[ô] Autor: Claudemir Pesooa da Luz Jr.
[ô]
[ô] Rotina para indireitar os arquivos no diretorio do lote, ja copiado!
[ô]
Dim fso As Scripting.FileSystemObject
Dim fld As Scripting.Folder
Dim fil As Scripting.File
Dim xDIR As String
Dim xfiles() As String
Dim imgi As Integer
Dim i As Integer
Set fso = New Scripting.FileSystemObject
For r = LBound(values, 2) To UBound(values, 2)
[ô]DIR_WORK & [Ô]\lote-[Ô] & NUM_LOTE & [Ô]\[Ô] & dirBarras
[ô]Debug.Print [Ô]checando diretorio 2 vez: [Ô] & Trim(DIR_SRV_SCANNER & [Ô]\[Ô] & values(c, r))
Debug.Print [Ô]checando diretorio 2 vez: [Ô] & DIR_WORK & [Ô]\lote-[Ô] & NUM_LOTE & [Ô]\[Ô] & values(c, r)
Debug.Print [Ô][Ô]
Set fld = fso.GetFolder(Trim(DIR_WORK & [Ô]\lote-[Ô] & NUM_LOTE & [Ô]\[Ô] & values(c, r)))
ReDim file_names(1 To fld.Files.Count)
i = 1
For Each fil In fld.Files
If fso.GetExtensionName(fil.Path) = [Ô]dat[Ô] Then
file_names(i) = fil.Name
[ô]Debug.Print i & [Ô] - [[Ô] & file_names(i) & [Ô]][Ô]
xfiles = Split(fil.Name, [Ô]_[Ô])
[ô] 159321085_0001.dat
[ô] xfiles(0) = 159321085
[ô] xfiles(1) = 0001.dat
imgi = Val(Left(xfiles(1), 4))
[ô] imgi = 1
[ô] se o dat file não estiver igual ao index.... move
If i <> imgi Then
Debug.Print [Ô]movendo [Ô] & Trim(DIR_WORK & [Ô]\lote-[Ô] & NUM_LOTE & [Ô]\[Ô] & values(c, r) & [Ô]\[Ô] & fil.Name) & [Ô] -> [Ô] & Trim(DIR_WORK & [Ô]\lote-[Ô] & NUM_LOTE & [Ô]\[Ô] & values(c, r) & [Ô]\[Ô] & values(c, r) & [Ô]_[Ô] & FN(Str(i), 4) & [Ô].dat[Ô])
fso.MoveFile Trim(DIR_WORK & [Ô]\lote-[Ô] & NUM_LOTE & [Ô]\[Ô] & values(c, r) & [Ô]\[Ô] & fil.Name), Trim(DIR_WORK & [Ô]\lote-[Ô] & NUM_LOTE & [Ô]\[Ô] & values(c, r) & [Ô]\[Ô] & values(c, r) & [Ô]_[Ô] & FN(Str(i), 4) & [Ô].dat[Ô])
End If
i = i + 1
End If
Next fil
Next r
[ô]
[ô] Fim da rotina
[ô]
Se precisarem de mais informação e só pedir.
Valeu!
Tópico encerrado , respostas não são mais permitidas