Extrair automaticamente arquivos de texto via linha de comando e combiná-los em um único arquivo de texto

1

Explicação detalhada do problema:

Estou tentando automatizar um processo no meu computador e tendo alguma dificuldade. Todos os dias, eu recebo um arquivo zip por email que contém um arquivo txt. Eu tenho um script no lugar que automaticamente leva o anexo e despeja-o em um diretório local.

Agora, estou tentando descobrir como posso obter o conteúdo do arquivo txt do diretório e anexá-lo a um "arquivo mestre". Então, basicamente, como isso funciona agora é que eu recebo um arquivo por e-mail todos os dias de [TODAY'S_DATE] .zip. Um script move esse arquivo para uma pasta. Eu então tenho um arquivo .bat que extrai o conteúdo para uma pasta chamada [TODAY'S_DATE] e move o arquivo para uma pasta chamada "Completed". Eu preciso saber como tirar o texto do arquivo como ele é extraído e despejá-lo em um arquivo "Master.txt" que será continuamente maior.

Isso evitaria a necessidade de extrair os arquivos para seus próprios diretórios e copiar manualmente o texto deles para o arquivo mestre.

Minha configuração:

  • Usando o Windows 7
  • Usando a linha de comando 7zip para extração
  • Usando o arquivo .Bat para extrair o arquivo do arquivo para o diretório

Problema:

  • Precisa tirar o txt do arquivo e mesclá-lo em um arquivo "master.txt".

Conteúdo atual do arquivo .bat:

7za x *.zip -o*

COPY /Y *.zip " \Completed\"

@echo extraction complete

Eu realmente aprecio qualquer ajuda que possa ser oferecida. Eu sei que isso foi realmente prolixo, mas muitas vezes quando vejo esses tipos de perguntas, não são apresentados detalhes suficientes. Obrigado novamente.

    
por Kris 11.05.2013 / 19:06

5 respostas

0

Quero agradecer a todos que tiveram tempo para responder. Fiz mais pesquisas na documentação do 7Zip e testei algumas coisas e finalmente cheguei à resposta.

Tenho certeza de que muitas das respostas nesta página podem ser usadas de várias maneiras para alcançar o mesmo resultado, mas eu queria evitar o máximo possível de manipulação de arquivos.

O que era necessário era mudar de 7zip (-so). Isso permite que você extraia o arquivo para STDOUT e pode redirecionar o fluxo para qualquer arquivo desejado.

Isto é o que parece:

7za e *.zip -y -so >> masterlist.txt

Isso me permitiu pular a extração do arquivo para um diretório completamente, o que ajuda a economizar espaço em disco e manipulação de arquivos. Se você tem uma estrutura para o diretório e você sabe o nome do arquivo (eu não tenho esse luxo), então você pode usar:

7za e *.zip -ir!PATH\FILENAME.txt -y -so >> masterlist.txt

Além disso, caso alguém queira ver o arquivo .bat, isso é o que eu tenho.

7za e *.zip -y -so >> masterlist.txt
MOVE /Y *.zip  Completed
@echo extraction complete

Linha 1: 7zip extrai o arquivo único e envia a saída para STDOUT e depois é anexado (> >) a masterlist.txt.

Linha 2: o arquivo zip é movido para a pasta Concluído para que não seja processado novamente no futuro.

Linha 3: Ele permite que você saiba que a extração está completa, embora você provavelmente não veja isso (pelo menos da maneira como estou usando).

Espero que isso ajude alguém. : -)

    
por 12.05.2013 / 05:13
1

Você pode acrescentar o conteúdo de um arquivo a outro arquivo com o comando "type" e o comando "> >" operador assim:

type todaysfile.txt >> masterfile.txt

Você pode primeiro ter que inserir uma nova linha no seu masterfile, então o novo conteúdo começa na sua própria nova linha, assim:

echo. >> masterfile

Se você não sabe os nomes dos arquivos, você pode acrescentar todos os arquivos no diretório "concluído" da seguinte forma:

type completed\* >> masterfile.txt

"type" e "echo" serão exibidos e "> >" operador diz para acrescentar essa saída a um arquivo.

Fonte: tipo , echo , redirecionamento de comandos

    
por 11.05.2013 / 19:32
1

É simples: copy file1.txt+fileX.txt intome.txt ou copy singlefile.txt+intome.txt

EDIT: apenas leia o seu comentário para o seu post. Então você não sabe os nomes dos arquivos? Deixe-me estender as coisas acima ... apenas um segundo:)

EDIT2: Eu tive que procurá-lo e acho que o mais fácil que você pode fazer é não saber o nome do arquivo: copy /b *.txt newfile.txt de Um cmd de linha de comando ou de lote para concatenar vários arquivos

    
por 11.05.2013 / 19:24
1

Não sei se entendi seu comentário sobre não saber o nome do seu arquivo. Eu acho que a sua situação é que você tem uma estrutura de diretórios algo assim:

|       ︙
|
+---current
|       730643_594352.txt
|
+---master
|       master.txt

em que você não sabe o nome ( 730643_594352.txt ) do arquivo current –– mas é o único arquivo (ou pelo menos o único arquivo .txt ) no diretório current , portanto *.txt funciona. Se é isso, por que não

ren current\*.txt current\today.txt

e depois operá-lo pelo nome ( today.txt )? Se você precisar preservar seu nome como recebido no zip enviado por email, crie um diretório paralelo temp e faça

copy current\*.txt temp\today.txt
    
por 12.05.2013 / 01:06
0

Você tem um novo arquivo chamado [TODAY'S_DATE] .zip que é movido para uma pasta por algum processo.

Eu assumo que:

  1. Na verdade, o arquivo tem o seguinte nome: 2013-0511.zip e é diferente a cada dia.
  2. O diretório atual no momento em que o arquivo .bat é executado é a mesma pasta em que o novo arquivo .zip foi criado.
  3. Existe apenas um arquivo .zip para processar a qualquer momento.
  4. A pasta em que o arquivo .txt é extraído é criada pelo processo de descompactação. Em outras palavras, a pasta de destino é nomeada dentro do arquivo .zip para que você não faça nada de especial para criar a pasta de destino nos comandos do arquivo em lotes.
  5. A parte do nome do .zip nome do arquivo (assim '2013-0511' no meu exemplo acima) é a mesma que a nome da pasta dentro do arquivo .zip e o mesmo que o nome da pasta em que o arquivo .txt é extraído.
  6. O caminho completo e o nome do arquivo "Master.txt" são constantes.

Aqui está um arquivo em lote que deve funcionar para você:

@echo off

rem    define the full path and filename of the "Master.txt" file
set "zzmaster=C:\Master\Master.txt"

for %%f in ("*.zip") do call :work "%%~dpf" "%%~nf"

rem        other processing here..., then goto :EOF
rem        recommend moving or deleting the .zip file so it is not present 
rem        the next time this is run, or use MOVE instead of COPY below


rem        cleanup environemnt variables if necessary
set "zzmaster="
set "zzpath="
set "zzname="
set "zztxt="


goto :EOF



:work
rem:work %1, %2 will contain the Path and Name of the .zip file (extension is of course .zip)

set "zzpath=%~1"
set "zzname=%~2"

rem        this will extract the .zip file as you specified before
7za x "%zzname%.zip" -o*
COPY /Y "%zzname%.zip" "\Completed\"
@echo extraction complete

rem        you know the folder that the .txt file was extracted into is the sane as %zzname%
rem        this will look in the new folder created by the unzip process and get all files with an extension of .txt
rem        this can easily be adjusted if it is not what you want.

for %%g in ("%zzname%\*.txt") do call :doappend "%%~nxg"


rem        optional: delete the folder that contained the extracted .txt file(s)
rem rd "%zzname%">nul 2>&1

goto :EOF



:doappend
rem:doappend %1 is the name.ext of the file to append to master

set "zztxt=%~1"

rem        optional: if Master file already exists, add a blank line to the end of Master file
if exist "%zzmaster%" echo.>> "%zzmaster%"


rem        append the contents of the extracted .txt file to the end of the Master file
type "%zzname%\%zztxt%" >> "%zzmaster%"


rem        optional: delete the extracted .txt file
rem del "%zzname%\%zztxt%">nul 2>&1


goto :EOF

Verifique o código "opcional" para ver se isso faz sentido para você.

Se minhas "suposições" não estiverem corretas ou se você precisar de algo alterado, me avise.

    
por 12.05.2013 / 03:46