Arquivo em lote para criar muitos arquivos com caracteres especiais

0

Informações essenciais: Eu tenho um arquivo "DB_OUTPUT.TXT" com 304 linhas que eu preciso transformar em 304 arquivos (um por linha). Cada linha contém muitos caracteres especiais e pode ter até dezenas de milhares de caracteres. Por esses motivos, estou tendo dificuldades em usar um arquivo em lote cmd.exe (que limita a quantidade de entrada) e o comando echo (que tentaria executar cada caractere especial, a menos que eu tivesse que escapar de todos eles).

Eu também tenho um arquivo "DB_OUTPUT_FILENAMES.TXT" contendo um nome de arquivo distinto para cada linha-soon-to-be-file de "db_output.txt". Portanto, a linha 1 do DB_OUTPUT.TXT precisa ser o corpo de um novo arquivo com um nome igual à linha 1 do DB_OUTPUT_FILENAMES.TXT.

Informações adicionais: Como você deve ter adivinhado, o DB_OUTPUT.TXT é gerado a partir de um banco de dados; ele contém 304 registros com 6 ou 7 colunas em uma largura fixa, com a última coluna sendo uma consulta SQL. Cada uma dessas linhas (registros db) será usada como um script para criar novos objetos de banco de dados, e é por isso que os caracteres especiais precisam ser preservados.

Pergunta: Existe uma maneira de fazer isso em uma forma de lote? Eu ficaria feliz com uma solução do Windows ou Linux.

    
por MollyOQ 05.11.2013 / 22:42

2 respostas

0

split deve funcionar (apenas testado em um arquivo binário que é ainda pior do que você descreve):

split -l 1 DB_OUTPUT.txt

Isso cria um monte de arquivos começando com um "x". Para renomear em lote, comece por

ls x* > oldnames

Verifique novamente se o número de linhas está de acordo:

wc -l oldnames DB_OUTPUT_FILENAMES.TXT

Isso deve dar o dobro do mesmo número de linhas se a lista de nomes de arquivos tiver o tamanho adequado. Finalmente,

( paste oldnames DB_OUTPUT_FILENAMES.TXT ) | while read i; do mv $i; done

(Observe que isso pressupõe que os nomes dos arquivos de saída não contenham espaços).

    
por 11.11.2013 / 02:25
0

Aqui está um script de shell:

#!/bin/sh

test "$#" -ne 3 && { echo arguments: datafile namefile dstdir ; exit 1 ; }

data="$1"
names="$2"
dstdir="$3"

test -e "$dstdir" || mkdir "$dstdir"

while read fn ; do
    read -r lin <&3
    echo -n "$lin" >"$dstdir/$fn"
done <"$names" 3<"$data"

Você pode executar o script em um ambiente semelhante ao Unix, como Linux, Mac OS X ou Cygwin no Windows. Armazene o script, por exemplo, em um arquivo splittofiles . Do chmod a+x splittofiles .

Execute: splittofiles DB_OUTPUT.TXT DB_OUTPUT_FILENAMES.TXT output . Os arquivos resultantes serão criados no diretório output .

O script deve ser aprimorado ao adicionar mais condições de verificação de erros. O programa em Python mencionado na nota pode ser mais rápido que esse script.

    
por 05.11.2013 / 23:51