Показать полную графическую версию : [решено] Размножить текст
Alexander_88
18-08-2014, 14:38
Здравствуйте.
есть txt файл, как сделать чтоб весь его текст копировался некоторое количество раз, которое я укажу. К примеру:
n=3 (n - количество раз)
если в txt:
test
test2
test3
то после применения в txt стало:
test
test2
test3
test
test2
test3
test
test2
test3
По простому:
@echo off
setlocal enableextensions enabledelayedexpansion
set sSourceFile=0001.txt
set /a iCount = 3
call :GetTemporaryName
>nul copy nul "%TemporaryName%"
for /l %%i in (1, 1, %iCount%) do >nul copy /b "%TemporaryName%"+"%sSourceFile%" "%TemporaryName%"
>nul copy "%TemporaryName%" "%sSourceFile%"
del /f /q "%TemporaryName%"
endlocal
exit /b 0
rem ==========================================================================
rem Функция GetTemporaryName()
rem
rem Серый форум / CMD/BAT: генерация пути для временного файла или папки
rem (http://forum.script-coding.com/viewtopic.php?id=6259)
rem ==========================================================================
:GetTemporaryName
setlocal enableextensions enabledelayedexpansion
:NextName
set sTempName=%temp%\temp%random%.tmp
if exist "%sTempName%" goto :NextName
set sProcName=%~0
endlocal & set %sProcName:~4%=%sTempName%
exit /b 0
rem ==========================================================================
Alexander_88
18-08-2014, 15:05
Спасибо, работает :yahoo:
А у Вас числа:
некоторое количество раз »
какого примерно порядка?
Alexander_88
18-08-2014, 17:27
числа 600, 1000, могут и больше быть, счас поставил 1000, долго идет процесс :(
Iska, представить "количество раз" в двоичном виде и начать удваивать результат, сохраняя те промежуточные значения, где в двоичном представлении единицы -- а по достижении максимума слить все промежуточные результаты? Тогда время вычислений будет расти не как n (или даже хуже?), а как двоичный логарифм n.
Alexander_88, попробуйте пакетный файл с таким кодом:
@(for /l %%i in (1 1 3) do @more<"example.txt")>.tmp& move .tmp "example.txt">nul
.
В том случае, если текст не заканчивается переводом строки, последняя строка каждой ,кроме последней, копии текста не будет сцепляться с первой строкой последующей копии:
test
test2
test3test
test2
test3test
test2
test3
.
Alexander_88
18-08-2014, 21:42
Спасибо, в этом варианте шустрее размножается :)
Iska, представить "количество раз" в двоичном виде и начать удваивать результат, сохраняя те промежуточные значения, где в двоичном представлении единицы -- а по достижении максимума слить все промежуточные результаты? »
Я как раз это и имел в виду, задавая свой вопрос. Можно было даже не оффтопиком, ибо вопрос эффективности весьма актуален.
Тогда время вычислений будет расти не как n (или даже хуже?) »
Много хуже. Мы ведь раз за разом туда-сюда, фактически бессмысленно, гоняем кучу данных. Пусть цепочка буферы/кэш ОС+буферы/кэш драйвера+буферы/кэш контроллера как-то нивелируют эту бессмысленность, однако же итоговые цифры остаются удручающими.
а как двоичный логарифм n. »
Это если степень двойки будет высокая, а оставшиеся простые сомножители невелики.
Тем не менее, играясь несколько лет назад с подобным же алгоритмом (VBScript & CMD: разделение файла на фрагменты и их последующее слияние — Серый форум (http://forum.script-coding.com/viewtopic.php?id=2322) и Скрипт для разбиения файла на части (http://forum.oszone.net/thread-149236.html)) с подачи коллеги Diamond я пришёл к выводу, что любые игры с «copy X+Y X» проигрывают по эффективности использованному там методу.
Посему так:
@echo off
setlocal enableextensions enabledelayedexpansion
set sSourceFile=0001.txt
set /a iCount = 3000
call :GetTemporaryName
>"%TemporaryName%" <nul set /p sVar=%iCount%
for %%i in ("%TemporaryName%") do set /a iSize = %%~zi
for /l %%i in (1, 1, %iSize%) do set sTemplate=!sTemplate!0
del /f /q "%TemporaryName%"
md "%TemporaryName%"
for /l %%i in (1, 1, %iCount%) do (
set sUnAlugnedFileName=%sTemplate%%%i
>nul copy /b "%sSourceFile%" "%TemporaryName%\!sUnAlugnedFileName:~-%iSize%!"
)
>nul copy /b "%TemporaryName%\*.*" "%sSourceFile%"
rd /s /q "%TemporaryName%"
endlocal
exit /b 0
rem ==========================================================================
rem Функция GetTemporaryName()
rem
rem Серый форум / CMD/BAT: генерация пути для временного файла или папки
rem (http://forum.script-coding.com/viewtopic.php?id=6259)
rem ==========================================================================
:GetTemporaryName
setlocal enableextensions enabledelayedexpansion
:NextName
set sTempName=%temp%\temp%random%.tmp
if exist "%sTempName%" goto :NextName
set sProcName=%~0
endlocal & set %sProcName:~4%=%sTempName%
exit /b 0
rem ==========================================================================
определяем длину «количества» в символах (нужно для выравнивания имён промежуточных файлов);
создаём папку в «%temp%»;
создаём в ней «количество» нумерованных копий исходного файла (нумерация дополнена слева нулями для выравнивания имён);
сливаем все копии в исходный файл одним копированием;
удаляем папку в «%temp%» вместе с промежуточными файлами.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.