![]() |
Циклическое повторение данных в файле
Здравствуйте.
Помогите создать скрипт или батник. ...что требуется? есть файл "A" размером, допустим, 208байт, нужно создать файл "B", гораздо большего размера, например 127139792байта , циклично заполненного содержимым из файла "A" т.е. проще говоря повторить файл "A" 611249 раз в файле "B". Подкиньте идею) Всю голову сломал |
Код:
>nul copy nul "b.txt" & for /l %i in (1, 1, 611249) do @>nul copy /b "b.txt"+"a.txt" "b.txt" |
Цитата:
|
Цитата:
Код:
fsutil file createnew "B.txt" 127139792 |
Цитата:
но как его заполнить файлом A?) |
Цитата:
На WSH: Скрытый текст
Код:
Option Explicit |
Цитата:
Код:
$cnt = 611249 первичный запуск: TotalSeconds : 16,5885417 повторный: TotalSeconds : 5,4562804 конечно, скорость от железа может зависеть, но вполне приемлемое время, имхо. |
YuS_2, я бы всё-таки вынес [io.file]::readalltext('a.txt') за пределы цикла. Понятно, что по сути повторное чтение будет идти из кэша, но всё же, всё же, всё же…
Цитата:
На мой взгляд, здесь лучше зараз писать в файл: конкатенация строк очень ресурсоёмкая операция. |
Код:
for /L %%i in (1, 1, 611249) do @type a.txt >> b.txt Цитата:
|
Цитата:
Скрытый текст
Составили программку: тысячи циклов, включающих конструкция типа:
ЦИКЛ ... ГДЕ A=3 ГДЕ B=5 ... КОНЦИКЛ Чуем — что-то долго считает... Остановили, пустили на дальнейшее пошаговое исполнение с распечаткой каждого шага. Сначала ошалели, потом долго смеялись: 50% распечатки заняли строки A=3 B=5 Ну заменили эти "ГДЕ" на константы, определив их перед циклом — и сразу программа задышала. :) |
VBS: попробовал соптимизировать немного. На старинном ноуте 2-3 сек
Прямой вариант от Iska 11-13 сек Код:
T1 = CStr(Now) |
кое что получилось вот таким образом:
Код:
@echo off |
|
Сидит полный форум несмыслёнышей: кодить умеют, а что писать не знают. И тут приходит Profile, весь в белом™ и наставляет на путь истинный: не берите шаблон из файла, а храните в переменной.
Позволяли бы батники работать с бинарными данными, - так бы и написали, а не советовали на других языках реализовывать. YuS_2, megaloman, Iska а вы уверены, что текстовое данных представление не даст стороннего эффекта? YuS_2, задним числом редактировать откоментированные сообщения некорректно и неэтично |
Цитата:
В смысле, что не так? Цитата:
Имхо, наоборот, неэтично плодить лишние сущности и оставлять для будущих читателей не совсем корректный код... да и в принципе, зачем дублировать сообщения с кодом, когда его можно просто поправить? Зайдет читатель в топик, а тут от разнообразия кода в глазах рябит и какой из представленных вариантов правильный? По-моему, гораздо правильнее оставить тот код, который наиболее верный и может представлять интерес для будущих читателей, а остальное беспощадно чистить... т.е. не вижу ни одной причины, чтобы хранить на форуме некорректные коды. |
Цитата:
|
Цитата:
611249=10010101001110110001b Скрытый текст
Запоминаем содержимое файла A как Шаблон-0 (ну этот шаг можно пропустить: оно и так будет в самом файле; просто для единообразия алгоритма) и далее используем как Шаблон-1.
Четыре раза (следующая единичка левее в двоичном значении) делаем конкатенацию Шаблон-1 с самим собой, сохраняя в том же Шаблон-1. Сохраняем полученный файл и далее используем как как Шаблон-2. Один раз (следующая единичка левее в двоичном значении) делаем конкатенацию Шаблон-2 с самим собой, сохраняя в том же Шаблон-2. Сохраняем полученный файл и далее используем как как Шаблон-3. И т.д. до последней единицы левее — сохраняя промежуточные удвоенные файлы при появлении 1 в исходном двоичном значении. Делаем конкатенацию всех промежуточных шаблонов, начиная с Шаблон-0. Задача решена. PS Возможна и более быстрая реализация этого алгоритма без использования промежуточных шаблонов, а только текущего удваиваемого и исходного файла A — если начать разборку двоичного значения слева. |
Цитата:
а как это в батнике реализовать? |
Цитата:
Цитата:
Profile, Вот CMD на основе Copy /B. По времени (несколько секунд) немного медленнее, чем моё решение в VBS (но там алгоритм менее эффективный и на основе текстового потока).
Код:
@@Echo Off |
вот на чистом bat
Код:
@echo off 14:46:20,29 14:47:09,82 но все же менее минуты, для сравнения время по коду megaloman, 15:10:38,53 15:10:39,47 НО, придется согласиться с появлением в каждой строке приставки: "$_n+1=" (n+1 - номер строки A.txt), что впрочем легко убирается (строка после "="), если нужен будет правильный вывод из B.txt. (Сразу сделать это не получиться если время дорого). |
Цитата:
Сутки не спал, то что нужно. Создается файл циклический как и нужно. Огромное спасибо всем откликнувшимся |
Время: 19:17. |
Время: 19:17.
© OSzone.net 2001-