Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Размножить текст (http://forum.oszone.net/showthread.php?t=286664)

Alexander_88 18-08-2014 14:38 2390756

Размножить текст
 
Здравствуйте.
есть txt файл, как сделать чтоб весь его текст копировался некоторое количество раз, которое я укажу. К примеру:
n=3 (n - количество раз)
если в txt:
test
test2
test3

то после применения в txt стало:
test
test2
test3
test
test2
test3
test
test2
test3

Iska 18-08-2014 14:51 2390769

По простому:
Код:

@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 2390776

Спасибо, работает :yahoo:

Iska 18-08-2014 15:21 2390787

А у Вас числа:
Цитата:

Цитата Alexander_88
некоторое количество раз »

какого примерно порядка?

Alexander_88 18-08-2014 17:27 2390862

числа 600, 1000, могут и больше быть, счас поставил 1000, долго идет процесс :(

mwz 18-08-2014 21:19 2390939

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

Georgio 18-08-2014 21:33 2390947

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 2390952

Спасибо, в этом варианте шустрее размножается :)

Iska 19-08-2014 10:44 2391124

Цитата:

Цитата mwz
Iska, представить "количество раз" в двоичном виде и начать удваивать результат, сохраняя те промежуточные значения, где в двоичном представлении единицы -- а по достижении максимума слить все промежуточные результаты? »

Я как раз это и имел в виду, задавая свой вопрос. Можно было даже не оффтопиком, ибо вопрос эффективности весьма актуален.

Цитата:

Цитата mwz
Тогда время вычислений будет расти не как n (или даже хуже?) »

Много хуже. Мы ведь раз за разом туда-сюда, фактически бессмысленно, гоняем кучу данных. Пусть цепочка буферы/кэш ОС+буферы/кэш драйвера+буферы/кэш контроллера как-то нивелируют эту бессмысленность, однако же итоговые цифры остаются удручающими.

Цитата:

Цитата mwz
а как двоичный логарифм n. »

Это если степень двойки будет высокая, а оставшиеся простые сомножители невелики.

Тем не менее, играясь несколько лет назад с подобным же алгоритмом (VBScript & CMD: разделение файла на фрагменты и их последующее слияние — Серый форум и Скрипт для разбиения файла на части) с подачи коллеги 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%» вместе с промежуточными файлами.


Время: 15:08.

Время: 15:08.
© OSzone.net 2001-