Основная информация: у меня есть файл "DB_OUTPUT.TXT" с 304 строками, который мне нужно превратить в 304 файла (по одному на строку). Каждая строка содержит много специальных символов и может быть длиной до десятков тысяч символов. По этим причинам у меня возникают трудности с использованием командного файла cmd.exe (который ограничивает объем вводимых данных) и команды echo (которая будет пытаться выполнить каждый специальный символ, если не считать необходимости экранировать их все).

У меня также есть файл "DB_OUTPUT_FILENAMES.TXT", содержащий отдельное имя файла для каждой строки, которая скоро должна быть в файле из "db_output.txt". Таким образом, строка 1 DB_OUTPUT.TXT должна быть телом нового файла с именем, равным строке 1 DB_OUTPUT_FILENAMES.TXT.

Дополнительная информация: Как вы уже догадались, DB_OUTPUT.TXT выводится из базы данных; он содержит 304 записи с 6 или 7 столбцами фиксированной ширины, причем последний столбец является запросом SQL. Каждая из этих строк (db records) будет использоваться в качестве сценария для создания новых объектов базы данных, поэтому специальные символы должны быть сохранены.

Вопрос: есть ли способ сделать это в пакетном режиме? Я был бы счастлив с решением для Windows или Linux.

2 ответа2

0

Вот сценарий оболочки:

#!/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"

Вы можете запустить скрипт в Unix-подобной среде, такой как Linux, Mac OS X или Cygwin под Windows. Сохраните сценарий, например, в файл splittofiles . Сделайте chmod a+x splittofiles .

Запустите его: splittofiles DB_OUTPUT.TXT DB_OUTPUT_FILENAMES.TXT output . Полученные файлы будут созданы в каталоге output .

Сценарий должен быть отшлифован путем добавления дополнительных условий проверки ошибок. Программа на Python, упомянутая в примечании, может быть быстрее, чем этот скрипт.

0

split должен работать (только что протестирован на двоичном файле, который даже хуже, чем вы описываете):

split -l 1 DB_OUTPUT.txt

Это создает кучу файлов, начинающихся с "x". Чтобы переименовать их, начните с

ls x* > oldnames

Дважды проверьте, что количество строк соответствует:

wc -l oldnames DB_OUTPUT_FILENAMES.TXT

Это должно дать вдвое больше одинакового количества строк, если ваш список имен файлов имеет правильную длину. В заключение,

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

(Обратите внимание, что это предполагает, что выходные имена файлов не содержат пробелов.)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .