|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Циклическое повторение данных в файле |
|
CMD/BAT - [решено] Циклическое повторение данных в файле
|
Старожил Сообщения: 168 |
Профиль | Отправить PM | Цитировать Здравствуйте.
Помогите создать скрипт или батник. ...что требуется? есть файл "A" размером, допустим, 208байт, нужно создать файл "B", гораздо большего размера, например 127139792байта , циклично заполненного содержимым из файла "A" т.е. проще говоря повторить файл "A" 611249 раз в файле "B". Подкиньте идею) Всю голову сломал |
|
Отправлено: 18:33, 17-01-2019 |
Ветеран Сообщения: 2710
|
Профиль | Отправить PM | Цитировать VBS: попробовал соптимизировать немного. На старинном ноуте 2-3 сек
Прямой вариант от Iska 11-13 сек T1 = CStr(Now) FileIn = "Z:\Box_In\FileIn.txt" FileOut = "Z:\Box_In\FileOut.txt" NMax = 611249 Set FSO = CreateObject("Scripting.FileSystemObject") On Error Resume Next Set fIn = FSO.OpenTextFile(FileIn, 1, False) If Err.Number <> 0 Then MsgBox "File " + FileIn + vbCrLf + Err.Description + "(" + CStr(Err.Number) + ")" WScript.Quit 2 End If On Error GoTo 0 Alls = fIn.ReadAll fIn.Close S1 = Alls S10 = Multi(S1, 10) S100 = Multi(S10, 10) S1000 = Multi(S100, 10) S10000 = Multi(S1000, 10) S100000 = Multi(S10000, 10) N100000 = Int(NMax / 100000) NN = NMax - N100000 * 100000 N10000 = Int(NN / 10000) NN = NN - N10000 * 10000 N1000 = Int(NN / 1000) NN = NN - N1000 * 1000 N100 = Int(NN / 100) NN = NN - N100 * 100 N10 = Int(NN / 10) N1 = NN - N10 * 10 Set F = FSO.OpenTextFile(FileOut, 2, True) For i = 1 To N100000 F.Write S100000 Next F.Write Multi(S10000, N10000) + Multi(S1000, N1000) + Multi(S100, N100) + Multi(S10, N10) + Multi(S1, N1) F.Close MsgBox T1 + vbCrLf + CStr(Now) '---------------------------------------------- Function Multi(SS, M) If M = 0 Then Multi = "" Exit Function End If SSM = SS For i = 2 To M SSM = SSM + SS Next Multi = SSM End Function |
------- Последний раз редактировалось megaloman, 18-01-2019 в 01:20. Отправлено: 01:08, 18-01-2019 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 168
|
Профиль | Отправить PM | Цитировать кое что получилось вот таким образом:
@echo off set symbol=FB7DB47D8BF0AC9840740C487413B40EBB0700CD10EBEFA0FD7DEBE6A0FC7DEBE1CD16CD19268B551A52B001BB0000E83B0072E85B8A5624BE0B7C8BFCC746F03D7DC746F4297D8CD9894EF2894EF6C606967DCBEA030000200FB6C8668B46F86603461C668BD066C1EA10EB5E0FB6C84A4A8A460D32E4F7E20346FC1356FEEB4A525006536A016A10918B4618969233D2F7F691F7F64287CAF7761A8AF28AE8C0CC020ACCB80102807E020E7504B4428BF48A5624CD136161720B40750142035E0B497506F8C341BB000060666A00EB set file=bin <nul set /p x=>%file% for /L %%A IN (1,1,611249) DO (<nul >>%file% set /p x=%symbol%) msg * "Done!" exit /b |
Последний раз редактировалось Profile, 18-01-2019 в 04:50. Отправлено: 03:18, 18-01-2019 | #12 |
Crazy Сообщения: 1171
|
Профиль | Отправить PM | Цитировать |
------- Отправлено: 09:25, 18-01-2019 | #13 |
Ветеран Сообщения: 3806
|
Профиль | Отправить PM | Цитировать Сидит полный форум несмыслёнышей: кодить умеют, а что писать не знают. И тут приходит Profile, весь в белом™ и наставляет на путь истинный: не берите шаблон из файла, а храните в переменной.
Позволяли бы батники работать с бинарными данными, - так бы и написали, а не советовали на других языках реализовывать. YuS_2, megaloman, Iska а вы уверены, что текстовое данных представление не даст стороннего эффекта? YuS_2, задним числом редактировать откоментированные сообщения некорректно и неэтично |
Отправлено: 10:56, 18-01-2019 | #14 |
Crazy Сообщения: 1171
|
Профиль | Отправить PM | Цитировать Цитата Busla:
В смысле, что не так? Цитата Busla:
Имхо, наоборот, неэтично плодить лишние сущности и оставлять для будущих читателей не совсем корректный код... да и в принципе, зачем дублировать сообщения с кодом, когда его можно просто поправить? Зайдет читатель в топик, а тут от разнообразия кода в глазах рябит и какой из представленных вариантов правильный? По-моему, гораздо правильнее оставить тот код, который наиболее верный и может представлять интерес для будущих читателей, а остальное беспощадно чистить... т.е. не вижу ни одной причины, чтобы хранить на форуме некорректные коды. |
||
------- Последний раз редактировалось YuS_2, 18-01-2019 в 11:23. Отправлено: 11:12, 18-01-2019 | #15 |
Старожил Сообщения: 168
|
Профиль | Отправить PM | Цитировать Цитата Busla:
|
|
Отправлено: 12:08, 18-01-2019 | #16 |
Ушел из жизни Сообщения: 8595
|
Профиль | Сайт | Отправить PM | Цитировать Цитата Profile:
611249=10010101001110110001b Скрытый текст
Запоминаем содержимое файла A как Шаблон-0 (ну этот шаг можно пропустить: оно и так будет в самом файле; просто для единообразия алгоритма) и далее используем как Шаблон-1.
Четыре раза (следующая единичка левее в двоичном значении) делаем конкатенацию Шаблон-1 с самим собой, сохраняя в том же Шаблон-1. Сохраняем полученный файл и далее используем как как Шаблон-2. Один раз (следующая единичка левее в двоичном значении) делаем конкатенацию Шаблон-2 с самим собой, сохраняя в том же Шаблон-2. Сохраняем полученный файл и далее используем как как Шаблон-3. И т.д. до последней единицы левее — сохраняя промежуточные удвоенные файлы при появлении 1 в исходном двоичном значении. Делаем конкатенацию всех промежуточных шаблонов, начиная с Шаблон-0. Задача решена. PS Возможна и более быстрая реализация этого алгоритма без использования промежуточных шаблонов, а только текущего удваиваемого и исходного файла A — если начать разборку двоичного значения слева. |
|
------- Последний раз редактировалось mwz, 18-01-2019 в 13:35. Отправлено: 13:23, 18-01-2019 | #17 |
Старожил Сообщения: 168
|
Профиль | Отправить PM | Цитировать Цитата mwz:
а как это в батнике реализовать? |
|
Отправлено: 13:35, 18-01-2019 | #18 |
Ветеран Сообщения: 2710
|
Профиль | Отправить PM | Цитировать Цитата Busla:
Цитата Profile:
Profile, Вот CMD на основе Copy /B. По времени (несколько секунд) немного медленнее, чем моё решение в VBS (но там алгоритм менее эффективный и на основе текстового потока).
@@Echo Off cls Set T=%Time% Set "FileIn=Z:\Box_In\FileIn.txt" Set "FileOut=Z:\Box_In\FileOut.txt" Set /A Max=611249 If Not Exist "%FileIn%" (Echo !!! File "%FileIn%" not found &Pause &Exit /B 2) Set /A @@01=2, @@02=4, @@03=8, @@04=16, @@05=32, @@06=64, @@07=128, @@08=256, @@09=512, @@10=1024, @@11=2048, @@12=4096, @@13=8192, @@14=16384, @@15=32768, @@16=65536, @@17=131072, @@18=262144, @@19=524288, @@20=1048576, @@21=2097152 Set /A Min=0 Set "Var=" Set "All=" Set /A Re=%Max% :Begin Set /A Re=%Re%-%Min% Set "All=%Var% %All% If %Re% LSS 2 GoTo :Continue FOR /F "usebackq tokens=1,2 delims==" %%i IN (`Set "@@"`) DO ( If %%j GTR %Re% GoTo :Begin Set /A Min=%%j Set "Var=%%j" ) :Continue Call :Double "%FileIn%" "%FileOut%" %Re% %All% Echo %Time% Echo %T% Pause GoTo :Eof :Double Copy /B %1 "%~1~tmp1" >nul Copy /B %1 "%~1~tmp2" >nul > %2 (cd.) If %3 EQU 1 Copy /B %1 %2 >nul Set /A i=1 :Beg1 Set /A i=2*i Copy /B "%~1~tmp2"+"%~1~tmp1" "%~1~tmp2" >nul Copy /B "%~1~tmp2" "%~1~tmp1" >nul If %i% NEQ %4 GoTo :Beg1 Copy /B %2+"%~1~tmp2" %2 >nul Shift /4 If Not "%4"=="" GoTo :Beg1 Del "%~1~tmp1" Del "%~1~tmp2" GoTo :Eof |
||
------- Последний раз редактировалось megaloman, 18-01-2019 в 16:18. Отправлено: 15:33, 18-01-2019 | #19 |
Ветеран Сообщения: 1274
|
Профиль | Отправить PM | Цитировать вот на чистом bat
@echo off <A.txt (for /f "delims=" %%a in ('more') do set /a n+=1& call set "$_%%n%%=%%a") >B.txt (for /l %%n in (1 1 611249) do @set $_) pause 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. (Сразу сделать это не получиться если время дорого). |
Последний раз редактировалось alpap, 18-01-2019 в 16:13. Отправлено: 16:05, 18-01-2019 | #20 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
VBS/WSH/JS - [решено] Повторение двух и более команд | ymo_4@vk | Скриптовые языки администрирования Windows | 1 | 01-12-2017 08:35 | |
Разное - [решено] Словари иностранных слов в текстовом файле, или в базе данных. | amask | Программирование и базы данных | 1 | 29-09-2016 20:37 | |
PowerShell - [решено] Переменные из данных в txt файле | breakfruit | Скриптовые языки администрирования Windows | 25 | 05-06-2015 17:10 | |
Java - Сохранение введённых данных в отдельном файле | mephistophel | Программирование и базы данных | 6 | 03-05-2012 21:41 | |
C/C++ - [решено] Поиск данных в файле | Luzuk | Программирование и базы данных | 5 | 05-11-2008 04:04 |
|