Создание текстового файла с набором символов
Уважаемые знатоки!
Помогите создать батник при запуске которого создавался бы текстовый файл с указанным количеством произвольных символов (буквы, цифры, знаки).
Варианты - либо я вношу количество символов в батник (допустим 592283), либо вопрос при запуске - "введите количество символов".
Спасибо заранее!))
|
Код:
>"Текстовый файл.txt" echo Произвольное количество каких-то там [1,2,5,$,#], знаков
не все знаки удастся вывести таким образом
Цитата:
Цитата 4zz
вопрос при запуске - "введите количество символов" »
|
set /p /?
|
4zz,
Цитата:
Цитата alpap
не все знаки удастся вывести таким образом »
|
Плюс
Цитата:
Цитата 4zz
количество символов в батник (допустим 592283), »
|
такую длинную строку в CMD обработать не удастся.
Поэтому, сакраментальный вопрос: зачем это нужно и почему CMD, а не, допустим, vbs?
Какие символы при этом допустимы?
|
megaloman, не силён в написании скриптов, но рандомный вариант может быть использован, отключив неиспользуемые символы.
Только я не представляю зачем это нужно :)
Очередной BALON?
|
4zz,
Вот вариант с клавиатурным набором знаков. Некоторые знаки валили скрипт, я их перечислил и не употребляю.
Не берусь судить, может еще какая-то зюкочка нагадит.
Код:
@Echo Off
cls
Set "Out=Z:\Box_Out\полная фигня.txt"
Set /A Max=8765
rem не использовать ^%&|<>"()'=
Set "Symb=~!#$*_+1234567890-QWERTYUIOP{}qwertyuiop[]ASDFGHJKL:asdfghjkl;\ZXCVBNM?zxcvbnm,./ Ё№ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮёйцукенгшщзхъфывапролджэячсмитьбю"
Set /A NS=-1 &FOR /L %%i IN (0,1,255) DO (Call :Substr %%i "S" &&Set /A NS+=1)
Set "Str="
Set /A N=0
Set /A M=0
Set /A Quant=4000
2>nul Del "%Out%"
:Begin
Set /A N+=1
Set /A M+=1
Set /A K=(%NS%+1)*%Random%/32768
Call :Substr %K% "S"
Set "Str=%Str%%S%"
If %N% EQU %Quant% (
Echo DownLoad %M%
<Nul Set /P "S=%Str%">>"%Out%"
Set "Str="
Set "S="
Set /A N=0
)
If %M% NEQ %Max% GoTo :Begin
If %N% NEQ 0 <Nul (Echo DownLoad %M% &Set /P S=%Str%>>"%Out%")
Pause
GoTo :Eof
:Substr
Call Set "@S=%%Symb:~%1,1%%"
Set "%~2=%@S%"
If "%@S%"=="" Exit /B 1
Exit /B 0
Длина файла скриптом не ограничивается, весь вопрос - а сколько времени займёт, допустим, генерирование и запись строки из нескольких сот тысяч символов.
|
Минимум изменений, но экономия по времени 20-25%.
Отличие - в способе извлечения символа из набора
Код:
@Echo Off
cls
Set "Out=Z:\Box_Out\полная фигня.txt"
Set /A Max=8765
rem не использовать ^%&|<>"()'=
Set "Symb=~!#$*_+1234567890-QWERTYUIOP{}qwertyuiop[]ASDFGHJKL:asdfghjkl;\ZXCVBNM?zxcvbnm,./ Ё№ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮёйцукенгшщзхъфывапролджэячсмитьбю"
Set /A NS=-1 &FOR /L %%i IN (0,1,255) DO (Call :Substr %%i "S" &&(Set /A NS+=1 &Call Set "@@@%%NS%%=%%S%%"))
Set "Str="
Set /A N=0
Set /A M=0
Set /A Quant=4000
2>nul Del "%Out%"
:Begin
Set /A N+=1
Set /A M+=1
Set /A K=(%NS%+1)*%Random%/32768
Call Set "Str=%Str%%%@@@%K%%%"
If %N% EQU %Quant% (
Echo DownLoad %M%
<Nul Set /P "S=%Str%">>"%Out%"
Set "Str="
Set "S="
Set /A N=0
)
If %M% NEQ %Max% GoTo :Begin
If %N% NEQ 0 <Nul (Echo DownLoad %M% &Set /P S=%Str%>>"%Out%")
Pause
GoTo :Eof
:Substr
Call Set "@S=%%Symb:~%1,1%%"
Set "%~2=%@S%"
If "%@S%"=="" Exit /B 1
Exit /B 0
В обоих кодах запись в файл ведётся квантами. Почему-то считал, чем больше квант, тем быстрее работа скрипта. Оказалось, не так однозначно. Буферизация? Но, в любом случае, генерация случайного набора занимает много больше времени.
|
megaloman,
Спасибо!
Все работает!))
Это нужно для файла в котором должно быть определенное количество символов, в разное время)

|
Работает, но очень долго..(
А может это можно ускорить копированием -вставкой?
Или из готового текстового файла посчитать количество символов и оставить необходимое, остальное удалить?
 
|
4zz, а может Вы подумаете про переход на WSH/PoSH вместо пакетных файлов?
|
VBS. Если в имени файла русские буквы - сохранить в 1251 кодировке
Код:
NMax = 56789
OutFile = "Z:\Box_Out\полная фигня.txt"
N1 = 32
N2 = 127
NS = N2 - N1
ReDim S(NS)
For i = 0 To NS
S(i) = Chr(i + N1)
Next
NS1 = NS + 1
SS = ""
Randomize
For i = 1 To NMax
SS = SS + S(Int(NS1 * Rnd))
Next
Set FSO = CreateObject("Scripting.FileSystemObject")
With FSO.CreateTextFile(OutFile, True)
.Write SS
.Close
End With
MsgBox Len(SS)
Вся последовательность генерируется. Работает, на вскидку, на порядок-два быстрее (не анализировал с цифрами) CMD. Но сотни символов - всё равно медленно.
Набор символов можно взять с кодами от 0 до 255. (N1 и N2).
Если можно
Цитата:
Цитата 4zz
А может это можно ускорить копированием -вставкой? »
|
, то возможно сгенерировать, допустим, 50000 знаков и затем их повторить нужное число раз. Это радикально ускорит работу.
|
Код:
Option Explicit
Dim dtNow
Dim strSourceFile
Dim iCount
Dim i, j
Dim sValue
dtNow = Now()
strSourceFile = "C:\Мои проекты\0254\полная фигня 2.txt"
iCount = 2^10
Randomize Timer
With WScript.CreateObject("Scripting.FileSystemObject").CreateTextFile(strSourceFile, True)
For i = 1 To iCount
sValue = ""
For j = 1 To iCount
sValue = sValue & Chr(Int(96 * Rnd()) + 32)
Next
.Write sValue
Next
.Close
End With
WScript.Echo DateDiff("s", dtNow, Now())
WScript.Quit 0
Если мне не изменяет память — максимальный размер строки должен вертеться в интервале примерно от 512 до 4096 (хотя мог уже и запамятовать, а ещё раз тестировать лень).
|
Iska, И всё-таки она вертится! Впечатлился скоростью работы Вашего скрипта. Ранее перед записью в файл я формировал всю строку целиком, затем скидывал в файл. ~500000 символов формировалось долго.
Вот vbs-вариант, в котором все символы генерируются случайным образом, но запись на диск ведётся квантами по 1024 знака как у Вас, а не целиком.
Отрабатывает за считанные секунды на моём допотопном ноуте
Код:
NMax = 543210
OutFile = "Z:\Box_Out\полная фигня 543210.txt"
N1 = 0
N2 = 255
Quant = 1024
NS = N2 - N1
ReDim S(NS)
For i = 0 To NS
S(i) = Chr(i + N1)
Next
NS1 = NS + 1
SS = ""
Randomize
Set FSO = CreateObject("Scripting.FileSystemObject")
With FSO.CreateTextFile(OutFile, True)
j = 0
For i = 1 To NMax
j = j + 1
SS = SS + S(Int(NS1 * Rnd))
If j = Quant Then
j = 0
.Write SS
SS = ""
End If
Next
If j > 0 Then .Write SS
.Close
End With
MsgBox "Скрипт завершен"
Похоже, можно пооптимизировать размер кванта, но пока это за пределами моего трудолюбия.
|
50000 — многовато, начинают сказываться издержки на конкатенацию строк.
Для примера
0004.vbs:
Код:
Option Explicit
Dim dtNow
Dim strSourceFile
Dim iCount
Dim i, j
Dim sValue
dtNow = Now()
strSourceFile = "C:\Мои проекты\0254\полная фигня 2.txt"
iCount = 2^15
Randomize Timer
With WScript.CreateObject("Scripting.FileSystemObject").CreateTextFile(strSourceFile, True)
For i = 1 To iCount
sValue = ""
For j = 1 To 2^10 ' Всего — 2^25, 32Мб выйдет
sValue = sValue & Chr(Int(96 * Rnd()) + 32)
Next
.Write sValue
Next
.Close
End With
WScript.Echo DateDiff("s", dtNow, Now())
WScript.Quit 0
и 0005.vbs:
Код:
dtNow = Now()
NMax = 2^25
OutFile = "C:\Мои проекты\0254\полная фигня 543210.txt"
N1 = 0
N2 = 255
Quant = 50000
NS = N2 - N1
ReDim S(NS)
For i = 0 To NS
S(i) = Chr(i + N1)
Next
NS1 = NS + 1
SS = ""
Randomize
Set FSO = CreateObject("Scripting.FileSystemObject")
With FSO.CreateTextFile(OutFile, True)
j = 0
For i = 1 To NMax
j = j + 1
SS = SS + S(Int(NS1 * Rnd))
If j = Quant Then
j = 0
.Write SS
SS = ""
End If
Next
If j > 0 Then .Write SS
.Close
End With
'MsgBox "Скрипт завершен"
WScript.Echo DateDiff("s", dtNow, Now())
Примерный итог:
|
megaloman, Iska,
Спасибо!!! ) 
|
Iska, Уже понял и исправил. Как подсчитать оптимум?
|
Извиняюсь.., а как прописать избранные и исключенные символы?
|
Цитата:
Цитата megaloman
Как подсчитать оптимум? »
|
Я тупо брал и циклически наращивал размер строки степенями двойки то ли с 64, то ли со 128 символов до то ли 32 Kb, то ли до 64 Kb, и писал некий, достаточно большой объём в файл. И подсчитывал время (всё это, разумеется, в одном скрипте, дабы не вручную). Точную цифру я уже не помню, но оптимум находился где-то в промежутке 512-4096 символов. Если вдруг найдётся время — попробую повторить.
Цитата:
Цитата 4zz
а как прописать избранные и исключенные символы? »
|
В моём варианте — пока никак.
|
megaloman,
В cmd я пытался регулировать в Вашем варианте:
rem не использовать ^%&|<>"()'=
Set "Symb=+1234567890-QWERTYUIOPqwertyuiopASDFGHJKLasdfghjklZXCVBNM?zxcvbnm"
|
Цитата:
Цитата 4zz
а как прописать избранные и исключенные символы? »
|
Задавайте литерал с символами сами внутри кавычек. Кавычка " прописывается в литерале удвоением ""
Код:
NMax = 5432109
OutFile = "Z:\Box_Out\полная фигня 5432109.txt"
AllChr = "~!@#$%^&*()_+QWERTYUIOP{}ASDFGHJKL:""|ZXCVBNM<>?`1234567890-=qwertyuiop[]asdfghjkl;'\zxcvbnm,./ "
Quant = 1024
N1 = 1
N2 = Len(AllChr)
NS = N2 - N1
ReDim S(NS)
For i = 0 To NS
S(i) = Mid(AllChr, i + 1, 1)
Next
NS1 = NS + 1
SS = ""
Randomize
Set FSO = CreateObject("Scripting.FileSystemObject")
With FSO.CreateTextFile(OutFile, True)
j = 0
For i = 1 To NMax
j = j + 1
SS = SS + S(Int(NS1 * Rnd))
If j = Quant Then
j = 0
.Write SS
SS = ""
End If
Next
If j > 0 Then .Write SS
.Close
End With
MsgBox "Скрипт завершен"
rem не использовать ^%&|<>"()'=
в CMD не есть задание исключений, это комментарий для моей/Вашей памяти
В vbs неприятностей с этими знаками нет, в строке можно задать с клавиатуры все символы.
|
Iska,
Цитата:
Цитата Iska
Я тупо брал и циклически наращивал размер строки »
|
У меня
Код:
Символы Секунды
64 3,6
128 3,5
256 3,4
512 3,3
1024 3,4
2048 3,7
4096 5,2
|
megaloman,
СПАСИБО!!! ВСЕ РАБОТАЕТ!)
|
Тут, наверное, всё-таки символы — внутри себя WSH хранит строки в виде Юникода.
|
Время: 06:40.
© OSzone.net 2001-