Что нового

[Данные, строки] поиск вхождений и замена

Regnits

Новичок
Сообщения
3
Репутация
0
Имеется файл со следующим текстом

1 бла бла бла бла
2 бла бла бла бла ("0х232323") бла бла бла ("0х434353") бла бла
3 бла б2 бла бла бла бла ("0х232323") бла бла бла ("0х434353") бла блала бла бла ("0х232323") бла бла бла ("0х434353") бла бла
........

Нужно. Открыть файл.
И тут самое главное начинается. Берем первую строку и находим первое вхождение соответсвующее(\b[\d]\w+), записываем его в поле, конвертируем. Если найденное вхождение после конвертации менять не нужно, нажимаем кнопку 1 и берем следующее вхождение в строке. Если найденное вхождение после конвертации менять нужно, то нажимаем кнопку 2, заменяем и ищем следующее вхождение. И так до конца файла. Полученный файл сохраняем под другим именем.


Для одной строки и первого и второго вхождения вроде так. Но ручной перебор переменной, как-то не айс :'(

Код:
#include <file.au3> ;подключить библиотеку file.au3
#include <String.au3>

$sString = 'бла бла бла бла ("0x232323") бла бла бла ("0х434353") бла бла'

$x = StringRegExp($sString, "\b\d\w+" , 3)

	GUICreate("String Converter", 500, 300)
    $title = GUICtrlCreateLabel("Hex To String", 220, 10) ; метки
    $text_label = GUICtrlCreateLabel("Hex String:", 15, 31)
    $result_label = GUICtrlCreateLabel ("Result:", 30, 61)

	$text = GUICtrlCreateInput($x[0], 75, 30, 400, 20) ; передача вхождения. Прочитали первое вхождение, как потом прочитать второе и т. д. ?
	$result = GUICtrlCreateInput("", 75, 60, 400, 20)

    $convert = GUICtrlCreateButton("конверт", 35, 230, 50, 20) ;кнопки
	$copy = GUICtrlCreateButton("Normal", 95, 230, 60, 20)
	$replace = GUICtrlCreateButton("Заменить", 155, 230, 60, 20)
    $next = GUICtrlCreateButton("След", 225, 230,80, 20)
	$converter = ""
	
	GUISetState()
    While 1
          $msg = GUIGetMsg()
            If $msg = -3 Then Exit
         Select
               Case $msg = $convert
                    $read =  GUICtrlRead($text)
                    $converter = _HexToString($read) ;перевод с 16 го в строку
                    GUICtrlSetData($result, $converter)
              Case $msg = $replace
                   $Str3 = "\b" & $read & "\b"
                   $sString = StringRegExpReplace($sString, $Str3, $converter)
                   $text = GUICtrlCreateInput($x[1], 75, 30, 400, 20)
              Case $msg = $next
                   $text = GUICtrlCreateInput($x[1], 75, 30, 400, 20)
              Case $msg = $copy
                   ClipPut($converter)
		 EndSelect
    WEnd
Так получается с файлом, но переписывает только первое вхождение(( :stars: :'(

Код:
#include <file.au3>
#include <String.au3>
#include <Array.au3>

$sFilePath = "Test_.txt"
$sFilePathOut = "Test_out.txt"
$hFileIn = FileOpen($sFilePath, 0)
$hFileOut = FileOpen($sFilePathOut, 2)
$bShift = False
$line = FileReadLine($hFileIn)

While not @error = -1
   $searchvhog = StringRegExp($line, "\b[\d]\w+", 1)
  If $searchvhog = 0 Then
	          FileWriteLine($hFileOut, $line)
	 Else
		$searchvhog = StringRegExp($line, "\b[\d]\w+", 3)

                      GUICreate("String Converter", 500, 300)
                      $title = GUICtrlCreateLabel("Hex To String", 220, 10)
                      $text_label = GUICtrlCreateLabel("Hex String:", 15, 31)
					  $result_label = GUICtrlCreateLabel ("Result:", 30, 61)

               For $r = 0 to UBound($searchvhog) - 1

                      $text = GUICtrlCreateInput($searchvhog[$r], 75, 30, 400, 20)
                      $result = GUICtrlCreateInput("", 75, 60, 400, 20)
                      $convert = GUICtrlCreateButton("convert", 35, 230, 50, 20)
                      $copy = GUICtrlCreateButton("Normal", 95, 230, 60, 20)
                      $replace = GUICtrlCreateButton("replace", 155, 230, 60, 20)
                      $next = GUICtrlCreateButton("next", 225, 230,80, 20)
                      $converter = ""
					  $Str = ""
                      GUISetState()
                          While 1
                             $msg = GUIGetMsg()
                             If $msg = -3 Then Exit
                                        Select
                                              Case $msg = $convert
                                                   $read =  GUICtrlRead($text)
												   $converter = _HexToString($read) 
                                                   GUICtrlSetData($result, $converter)
				                              Case $msg = $replace
												   $Str = $read
												   MsgBox(0, "", $line)
												   $Str3 = "\b" & $read & "\b"
												   $line = StringRegExpReplace($line, $Str3, $converter)      
												   FileWriteLine($hFileOut, $line)
												Case $msg = $next
												ExitLoop
                                        EndSelect
	                      WEnd

			   Next
		EndIf
      $line = FileReadLine($hFileIn)
Wend

FileClose($hFileIn)
FileClose($hFileOut)

Народ, у мня вроде получилось!!!!. Но я не уверен
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
464
Прочитать файл построчно в массив так
Код:
$a = FileReadToArray('Новый текстовый документ.txt')
For $line = 0 To UBound($a) -1
	MsgBox(0, 'Строка ' & $line, $a[$line])
Next

Все что дальше не понятно, если нужно то IF нужно THEN делаем если нужно ELSE если не нужно ENDIF
 
Автор
Regnits

Regnits

Новичок
Сообщения
3
Репутация
0
inververs сказал(а):
Прочитать файл построчно в массив так
Код:
$a = FileReadToArray('Новый текстовый документ.txt')
For $line = 0 To UBound($a) -1
	MsgBox(0, 'Строка ' & $line, $a[$line])
Next

Все что дальше не понятно, если нужно то IF нужно THEN делаем если нужно ELSE если не нужно ENDIF
Дальше берем строку и "натравливаем" на нее регулярное выражение. Остальное читайте первый пост :smile:
 
Автор
Regnits

Regnits

Новичок
Сообщения
3
Репутация
0
Всем спасибо, решение найдено :dance2: :IL_AutoIt_2:
 
Верх