AJUDA - ALGORITMO PARA ORDENA?ÃO DE ARQUIVOS

XMAXMEX 21/10/2015 18:14:11
#452860
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
DS2T 21/10/2015 20:36:48
#452866
Resposta escolhida
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!
KERPLUNK 21/10/2015 20:51:25
#452867
Acho que sei qual vai ser a próxima pergunta...
XMAXMEX 21/10/2015 20:55:43
#452868
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.
DS2T 22/10/2015 08:05:39
#452875
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!
XMAXMEX 22/10/2015 10:17:47
#452884
Entendi,

Irei realizar uns testes aqui, e tentarei renomea-los no final, de acrodo com o index.

Valeu.
XMAXMEX 22/10/2015 16:34:15
#452912
Amigos,

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