Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Размножить текст

Ответить
Настройки темы
CMD/BAT - [решено] Размножить текст

Ветеран


Сообщения: 531
Благодарности: 4

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 14:38, 18-08-2014

 

Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


По простому:
Код: Выделить весь код
@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 ==========================================================================
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:51, 18-08-2014 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Ветеран


Сообщения: 531
Благодарности: 4

Профиль | Отправить PM | Цитировать


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

Отправлено: 15:05, 18-08-2014 | #3


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


А у Вас числа:
Цитата Alexander_88:
некоторое количество раз »
какого примерно порядка?

Отправлено: 15:21, 18-08-2014 | #4


Ветеран


Сообщения: 531
Благодарности: 4

Профиль | Отправить PM | Цитировать


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

Отправлено: 17:27, 18-08-2014 | #5

mwz mwz вне форума

Аватара для mwz

Ушел из жизни


Сообщения: 8595
Благодарности: 2127

Профиль | Сайт | Отправить PM | Цитировать


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

-------
Mikhail Zhilin


Отправлено: 21:19, 18-08-2014 | #6


Ветеран


Сообщения: 874
Благодарности: 575

Профиль | Отправить PM | Цитировать


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
.
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:33, 18-08-2014 | #7


Ветеран


Сообщения: 531
Благодарности: 4

Профиль | Отправить PM | Цитировать


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

Отправлено: 21:42, 18-08-2014 | #8


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата 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%» вместе с промежуточными файлами.

Отправлено: 10:44, 19-08-2014 | #9



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Размножить текст

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
оптимизированный текст и неоптимизированный текст vanoman Вебмастеру 3 29-10-2014 20:31
LCD-мониторы: текст тёмных цветов выглядит как чёрный текст CyraxZ Видеокарты 7 11-05-2013 20:45
Разное - Как из текст редактора Adobe reader 9 перевести в текст редактора Word zzss Хочу все знать 8 31-12-2012 09:54
CMD/BAT - С помощью bat-ника найти и заменить текст в файле на текст из другого файла Nun-Nun Скриптовые языки администрирования Windows 1 08-03-2011 15:25
Текст в таблицах. ivank Вебмастеру 7 11-04-2002 13:46




 
Переход