Войти

Показать полную графическую версию : [решено] Размножить текст


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

Iska
18-08-2014, 14:51
По простому:
@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:

Iska
18-08-2014, 15:21
А у Вас числа:
некоторое количество раз »
какого примерно порядка?

Alexander_88
18-08-2014, 17:27
числа 600, 1000, могут и больше быть, счас поставил 1000, долго идет процесс :(

mwz
18-08-2014, 21:19
Iska, представить "количество раз" в двоичном виде и начать удваивать результат, сохраняя те промежуточные значения, где в двоичном представлении единицы -- а по достижении максимума слить все промежуточные результаты? Тогда время вычислений будет расти не как n (или даже хуже?), а как двоичный логарифм n.

Georgio
18-08-2014, 21:33
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
19-08-2014, 10:44
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