Что нового

Скрипт замена текста (искомая строка берется из файла, рандомно)

dixxia

Новичок
Сообщения
2
Репутация
0
добрый вечер, . Не знаю как сделать скрипт, да и честно, не смогу.
Суть такова.
Есть текстовой файл data.txt. В нем, допустим, 1024 строки (это значение мне известно будет, так как файл я буду заполнять сам), в каждой строке текст (например, TextABC или Number145...). Есть файл out.dat. Скрипт должен найти в бинарном файле out.dat текстовую строку "String18" и поменять ее на текст рандомной строки из файла data.txt. Каждый раз, запуская скрипт, текст "String18" в файле out.dat меняется на новый из файла data.txt. Может быть, вам интересно будет статью написать на эту тему. Если на AutiIt - отлично, но вообще, мне не важно, в cmd, PowerShell, grep, в чем угодно, для Windows. После модификации файл out.dat сохраняется как new.dat. Все файлы в одной директории. Размер out.dat не больше 100 kb.
И то же самое, но для HEX. Скрипт ищет в out.dat строку 04 bb 32 ff 09 07 ab. Значения для подмены берет рандомно из data.txt, в котором в каждой строке находится текст вида ff 54 ab 00 78 dd 01 (и так далее).
Я очень далек, к сожалению, от программирования. Так как здесь не платные заказы, а немного заплатить я готов, то, конечно, сделаю пожертвование :smile:
 

Andr

Новичок
Сообщения
5
Репутация
2
Где-нибудь так на VBS, не проверял, не могу пока... Можете попробовать попрограммировать. Вот справка.
vbs:
Set FSO = CreateObject("Scripting.FileSystemObject")
Set objRegExp = CreateObject("VBScript.RegExp")
Set File1 = FSO.GetFile("C:\data.txt")
Set File2 = FSO.GetFile("C:\out.dat")
Set TextStream1 = File1.OpenAsTextStream(1) 'Открыть файл для чтения
'Считать одну строку со случайным номером
str = vbNullString
MyValue = Int((1024 * Rnd) + 1)
for i=1 to MyValue
   TextStream.SkipLine
next i
'str = vbNullString
str = str & TextStream.ReadLine() & vbCrLf
TextStream1.Close
Set TextStream2 = File2.OpenAsTextStream(2) 'Открыть файл для записи
'Считать весь текст
text = vbNullString
While Not TextStream2.AtEndOfStream
    text = text & TextStream2.ReadLine() & vbCrLf
Wend
'Найти str в text
objRegExp.Pattern = "String18"
'objRegExp.Pattern = Hex(04bb32ff0907ab)
text = objRegExp.Replace(text, str)
TextStream2.WriteLine text
TextStream2.Close
Сообщение автоматически объединено:

По первой части приложил.
 

Вложения

  • решение.zip
    801 байт · Просмотры: 3
Последнее редактирование:
Автор
D

dixxia

Новичок
Сообщения
2
Репутация
0
Где-нибудь так на VBS, не проверял, не могу пока... Можете попробовать попрограммировать. Вот справка.
vbs:
Set FSO = CreateObject("Scripting.FileSystemObject")
Set objRegExp = CreateObject("VBScript.RegExp")
Set File1 = FSO.GetFile("C:\data.txt")
Set File2 = FSO.GetFile("C:\out.dat")
Set TextStream1 = File1.OpenAsTextStream(1) 'Открыть файл для чтения
'Считать одну строку со случайным номером
str = vbNullString
MyValue = Int((1024 * Rnd) + 1)
for i=1 to MyValue
   TextStream.SkipLine
next i
'str = vbNullString
str = str & TextStream.ReadLine() & vbCrLf
TextStream1.Close
Set TextStream2 = File2.OpenAsTextStream(2) 'Открыть файл для записи
'Считать весь текст
text = vbNullString
While Not TextStream2.AtEndOfStream
    text = text & TextStream2.ReadLine() & vbCrLf
Wend
'Найти str в text
objRegExp.Pattern = "String18"
'objRegExp.Pattern = Hex(04bb32ff0907ab)
text = objRegExp.Replace(text, str)
TextStream2.WriteLine text
TextStream2.Close
Сообщение автоматически объединено:

По первой части приложил.
Спасибо огромное, проверю. За справку отдельное спасибо. У меня есть на cmd bat (спасибо товарищу, который помог), который это делает, но скорость работы очень мала, нашел skf, делает замену мгновенно, но полностью скрипт собрать на skf у меня мозгов не хватает... Попробую ваш вариант.
 

Andr

Новичок
Сообщения
5
Репутация
2
По второй части:
Код:
#include <File.au3>
Local $n = _FileCountLines("D:\Testing\au&vbs1\data2.txt")
$n = Random(1, $n, 1)
;MsgBox(0, "Случайное число", $n)
Local $substFile = FileOpen("D:\Testing\au&vbs1\data2.txt", 0)
Local $substStr = FileReadLine($substFile, $n)
;MsgBox(0, "Случайная строка", $substStr)
FileClose($substFile)
Local $targetFile = FileOpen("D:\Testing\au&vbs1\out2.dat",16)
Local $OutData = FileRead($targetFile)
;MsgBox(0, "Данные", $OutData)
$OutData = StringReplace($OutData, "04BB32FF0907AB", $substStr)
;MsgBox(0, "Новые данные", $OutData)
FileClose($targetFile)
; Открыть для перезаписи
$targetFile = FileOpen("D:\Testing\au&vbs1\out2.dat", 18)
FileWrite($targetFile, Binary($OutData))
FileClose($targetFile)

Редактор PSPad умеет быстро переключаться между текстовым и HEX-представлением данных.
По поводу режимов функции FileOpen (пояснение):
16 - это из справки - "$FO_BINARY (16) = Force binary mode" - двоичный режим;
18 в справке нет, оно получается объединением 2 (Write mode) и 16:
2 = 0x00000010
16 = 0x00010000
18 = 0x00010010
Сообщение автоматически объединено:

Похоже что байты записываются в обратном порядке, а считываются в прямом поэтому для поиска и замены потребуется ещё функция ByteReverse...
Код:
#include <File.au3>
Local $n = _FileCountLines("D:\Testing\au&vbs1\data2.txt")
$n = Random(1, $n, 1)
Local $substFile = FileOpen("D:\Testing\au&vbs1\data2.txt", 0)
Local $substStr = FileReadLine($substFile, $n)
FileClose($substFile)
Local $targetFile = FileOpen("D:\Testing\au&vbs1\out2.dat",16)
Local $OutData = FileRead($targetFile)
$OutData = StringReplace($OutData, ByteReverse("04BB32FF0907AB"), $substStr)
FileClose($targetFile)
; Открыть для перезаписи
$targetFile = FileOpen("D:\Testing\au&vbs1\out2.dat", 18)
FileWrite($targetFile, Binary($OutData)) ; Binary!!! обязательно
FileClose($targetFile)
;AB0709FF32BB04
Func ByteReverse($str)
   Local $full=$str
   Local $head=$full
   Local $b=StringRight($head, 2)
   for $i=2 to StringLen($full)/2
      $head=StringTrimRight($head, 2)
      $b=$b&StringRight($head, 2)
   Next
   Return $b
EndFunc

Для создания тестовых 100кб данных использовал это:
Код:
$p = "D:\Testing\au&vbs1\out2.dat"
$str = DataBlock(100, 0x04BB32FF0907AB) 
;~ MsgBox(0, "data",$str) ;Binary не отобразятся (выводит 0)
Func DataBlock($kb, $temp)
   FileDelete($p)
   $h = FileOpen($p, 17)
   Dim $s=0
   for $i=1 to 1024*($kb/2)/4
      FileWrite($h, 0x00)
   Next
   FileWrite($h, $temp)
   for $i=1 to 1024*($kb/2)/4
      FileWrite($h, 0x00)
   Next
   FileClose($h)
EndFunc

Сообщение автоматически объединено:

Если у вас строки в data.txt с пробелами (разделения байтов) - есть готовая функция StringStripWS.
 
Последнее редактирование:
Верх