DEV Community

Michelle Azevedo
Michelle Azevedo

Posted on

Navegar subpastas com UiPath

Vamos processar arquivos que estão dentro de subpastas

Para exemplo desse post, vamos imaginar que temos uma pasta que é alimentada via FTP com uma pasta por dia, onde várias planilhas dentro.

Alt Text

Precisamos extrair alguns dados dessas planilhas, vamos ao fluxo:

Na inicialização, vamos colocar em um array todas as pastas que estiverem dentro da principal, vai que acumularam alguns dias, como os finais de semana:

Directory.GetDirectories(str_pasta,"*.*", SearchOption.AllDirectories)
Enter fullscreen mode Exit fullscreen mode

Dentro dessa pasta tem apenas uma fixa, a "processadas", onde guardamos as que já fizemos extração. Vamos excluir essa pasta do array, primeiro pegando o nome da pasta:

str_pasta + processadas
Enter fullscreen mode Exit fullscreen mode

E depois eliminando ele do array:

arr_folders.Where(Function(s) s <> str_procesadas).ToArray
Enter fullscreen mode Exit fullscreen mode

Vamos verificar se há alguma pasta a ser processada:

Alt Text

Se sim, vamos para o próximo fluxo:

Alt Text

Na etapa seguinte, temos dois loops:

  • O que roda todas as pastas do dia (se a ultima vez que a automação rodou foi na sexta e o FTP alimenta a pasta também aos finais de semana, por exemplo, então haverá mais de uma pasta do dia a ser processada)
  • O dos arquivos dentro dessas pastas do dia.

Primeiro, vamos pegar a primeira pasta que estiver no array:

str_pastaDoDia = arr_folders(0).ToString
Enter fullscreen mode Exit fullscreen mode

E então criamos uma variável de array, com todos os arquivos que estiverem dentro dela:

arr_temp = Directory.GetFiles(str_pastaDoDia)
Enter fullscreen mode Exit fullscreen mode

Dentro desse array que vamos rodar um for loop:

Alt Text

Cada item corresponde a uma planilha, mas poderia ser um arquivo PDF para passar um OCR, um txt, ou qualquer outro tipo de extração. Enfim, nesse caso vamos extrair algumas variáveis que estão sempre na segunda linha da primeira coluna da planilha:

str_temp = dt.row(0)(1).tostring
Enter fullscreen mode Exit fullscreen mode

E inserir ela em uma datatable (preferencialmente, previamente criada na inicialização) com a atividade add row:

Alt Text

Por fim, vamos transferir esse arquivo para outra pasta. Para isso, primeiro precisamos do nome do arquivo, vamos extrair com uma atividade ou uma regex:

str_tempp = System.Text.RegularExpressions.Regex.match(item.tostring, "(?<=\d{4}-\d{2}-\d{2}).*").ToString
Enter fullscreen mode Exit fullscreen mode

No meu caso o caminho do arquivo tem um padrão C:\computador\usuario...\2021-02-01\nomedoarquivo.csv, então a regex acima pega qualquer informação á partir da última barra. Enfim, em seguida utilizar a atividade move file:

Alt Text

Essa é uma forma de sinalizar que o arquivo foi processado. Outras formas também poderiam ser trocar o nome do arquivo, inserir alguma mensagem dentro do próprio arquivo (quando possível), reunir o nome de todos eles e enviar apenas os nomes para o usuário checar - através do arquivo com os logs, por exemplo - ou deletar ele completamente. Depende do que fizer mais sentido para os agentes envolvidos no processo.

Essa sinalização de que o arquivo foi processado é somente para caso uma pessoa vá checar manualmente, pois o loop vai terminar quando todos os arquivos da array forem processados como item. Aliás essa é a razão para não colocarmos a função que extrai todos os arquivos direto no loop:

Alt Text

Se feito como na imagem acima, não é possível fazer alterações dentro do loop que mudem os arquivos de caminho ou sequer trocar seus nomes, pois o UiPath vai levantar um erro avisando que, durante o loop, houve modificação no array que ele esta sendo processando (no caso, todos os arquivos dentro de tal diretório), então para não correr o risco de entrar em um loop infinito, ele da erro e pára o processo.

Enfim, Ao finalizar a extração de dados em cada um dos arquivos dentro da pasta, ainda temos outro loop que esta verificando se há mais ~pastas do dia com arquivos dentro. Esse loop nós estamos fazendo "manualmente" e não dentro da atividade for each, portanto vamos excluir da array o primeiro item que já processamos (a primeira pasta).

arr_folders = arr_folders.Where(Function(s) s <> str_pastaDia).ToArray
Enter fullscreen mode Exit fullscreen mode

E verificar se ainda há outras:

Alt Text

Se houverem outras, o programa vai pegar novamente o primeiro item do array (que será outra pasta) e rodar essa pasta no for each para extração dos arquivos que estão dentro delas.

Quando o número de pastas a serem processadas acabar (pois teremos deletado cada uma delas do array), podemos enviar a automação para os outputs, daí também fica a critério do que for mais interessante para a usuária: criar uma tabela, enviar um txt por e-mail, subir no banco de dados, alimentar uma aplicação de análise de dados ou qualquer outro output.

E, esse foi um modo de extrair arquivos dentro de subpastas. Espero que tenha dado ideias para que você possa simplificar seu dia a dia de alguma forma. Até a próxima, happy automation!

Top comments (0)