Что нового

[Данные, строки] Обработка текста

atem321

Новичок
Сообщения
1
Репутация
0
Всем привет :smile:
Поставили мне задачу из файла вида:
Код:
.inputs a b c d
.outputs e f g h i j k l m n
.gate nor1 a=d y=[103]
.gate nor2 a=c b=d y=[115]
.gate nor1 a=[115] y=[104]
и т.д.
Сделать файл вида:
Код:
y[0] = !x[2];
y[1] = !x[2];
y[2] = !x[0];
y[3] = !x[1];
y[4] = !(x[0] || x[1]);
y[5] = !(y[2] || y[3]);
y[6] = !(x[0] || x[1]);

Как я делал:
записал все строки в массив $arr
заменил все входы (.inputs a b c d) на x[0] и т.д.
заменил все выходы (.outputs e f g h i j k l m n) на z[0] и т.д.
Всё сделано было с помощью for to и StringRegExpReplace
Получился такой файл:
Код:
nor1 x[3] y=[103]
nor2 x[2] x[3] y=[115]
nor1 a=[115] y=[104]
nor1 x[0] y=[100]
nor1 x[1] y=[101]
nor3 a=[104] x[0] x[1] y=[0]
nor1 a=[0] z[0]
nor3 a=[104] x[1] c=[100] y=[1]
nor1 a=[1] z[1]
nor3 a=[104] x[0] c=[101] y=[2]
nor1 a=[2] z[2]
nor3 a=[104] b=[100] c=[101] y=[3]
nor1 a=[3] z[3]
nor2 a=[115] x[3] y=[116]
Начал делать замену всех не x[],z[] переменных на y[].
Для этого сделал новый массив $arr1 куда тем же for to поместил все индексы ( 103 115 104 100 101 и т.д.)
Код:
For $a= 0 To $max Step +1
		$param=StringInStr($arr,'a=['&$a&']')
		$param=StringInStr($arr,'b=['&$a&']')
		$param=StringInStr($arr,'c=['&$a&']')
		$param=StringInStr($arr,'d=['&$a&']')
		$param=StringInStr($arr,'y=['&$a&']')
;----------------------------Запись их в вспомогательный массив arr1--
		If $param>0 Then
				$arr1=$a
				$j1=$j1+1
				FileWriteLine($y_var, $arr1 & @CRLF)
			EndIf
	Next
Здесь $max - максимальное значение индекса(задаётся руками, если поможете автоматизировать это, буду очень благодарен)
Далее идёт само преобразование ( в полном коде видно)
На выходе:
Код:
nor1 x[3] y[19]
nor2 x[2] x[3] y[18]
nor1 y[18] y[17]
nor1 x[0] y[16]
nor1 x[1] y[15]
nor3 y[17] x[0] x[1] y[14]
nor1 y[14] z[0]
nor3 y[17] x[1] y[16] y[13]
nor1 y[13] z[1]
nor3 y[17] x[0] y[15] y[12]
nor1 y[12] z[2]
nor3 y[17] y[16] y[15] y[11]
nor1 y[11] z[3]
nor2 y[18] x[3] y[13]6]
nor1 y[13]6] y[13]9]
nor3 y[13]9] x[0] x[1] y[8]
nor1 y[8] z[4]
nor3 y[13]9] x[1] y[16] y[7]
nor1 y[7] z[5]
nor3 y[13]9] x[0] y[15] y[6]
nor1 y[6] z[6]
nor3 y[13]9] y[16] y[15] y[5]
nor1 y[5] z[7]
nor3 y[19] x[1] x[2] y[13]7]
nor1 y[13]7] y[13]4]
nor2 x[0] y[13]4] y[2]
nor1 y[2] z[8]
nor2 y[16] y[13]4] y[1]
nor1 y[1] z[9]
.end
Проблема1 :
Если есть переменная y=[115], то при наличии индекса 1 получим что-то вроде y[18] 15]

Подскажите как исправить! Целый день сижу всё никак не придумать :(
Пример файла 123.txt:
Код:
.inputs a b c d
.outputs e f g h i j k l m n
.gate nor1 a=d y=[103]
.gate nor2 a=c b=d y=[115]
.gate nor1 a=[115] y=[104]
.gate nor1 a=a y=[100]
.gate nor1 a=b y=[101]
.gate nor3 a=[104] b=a c=b y=[0]
.gate nor1 a=[0] y=e
.gate nor3 a=[104] b=b c=[100] y=[1]
.gate nor1 a=[1] y=f
.gate nor3 a=[104] b=a c=[101] y=[2]
.gate nor1 a=[2] y=g
.gate nor3 a=[104] b=[100] c=[101] y=[3]
.gate nor1 a=[3] y=h
.gate nor2 a=[115] b=d y=[116]
.gate nor1 a=[116] y=[109]
.gate nor3 a=[109] b=a c=b y=[4]
.gate nor1 a=[4] y=i
.gate nor3 a=[109] b=b c=[100] y=[5]
.gate nor1 a=[5] y=j
.gate nor3 a=[109] b=a c=[101] y=[6]
.gate nor1 a=[6] y=k
.gate nor3 a=[109] b=[100] c=[101] y=[7]
.gate nor1 a=[7] y=l
.gate nor3 a=[103] b=b c=c y=[117]
.gate nor1 a=[117] y=[114]
.gate nor2 a=a b=[114] y=[8]
.gate nor1 a=[8] y=m
.gate nor2 a=[100] b=[114] y=[9]
.gate nor1 a=[9] y=n
.end
Вот весь код:
Код:
#include <Array.au3>
$input= FileOpen("123.txt",0)
$output= FileOpen("132.txt",2)
$y_var= FileOpen("111.txt",2)
$max=120 ; Максимальный индекс 3 переменной ( y[] )
$j=1 ; Вспомогательный массив
$j1=0 ; Вспомогательный массив
$n=0 ; Массив данных
$a=0 ; Переменная для 3 замены( у[])
$int=0 ; Счётчик для замены 3 переменной( у[])
;-----------Определение количества вх и вых переменных-------
$c1=FileReadLine($input,1)
$c1=StringReplace($c1,".inputs", "")
$l1=StringLen($c1)
$c2=FileReadLine($input,2)
$c2=StringReplace($c2,".outputs", "")
$l2=StringLen($c2)
$in= $l1/2 ; Количество входных переменных
$out=$l2/2 ; Количество выходных переменных
FileClose($input)
;------------------------------------------------------------
;-----------------------------Определение размера массива-----
$input= FileOpen("123.txt",0)
While 1
	$line= FileReadLine($input)
	If @error = -1 Then ExitLoop
	$n=$n+1
WEnd
;--------------------------------------------------------------

Global $arr[$n] ; Массив данных
Global $arr1[$j] ;Вспомогательных массив
$input= FileOpen("123.txt",0)
FileReadLine($input,2) ; Пропуск лишней строки
;----------------------------Ввод массива--------
For $i = $n to 0 Step -1
	$arr= FileReadLine($input)
	$inp=0 ; Счётчик для замены 1 переменной( x[])
	$outp=0 ; Счётчик для замены 2 переменной( z[])
	$k=97 ; Восьмеричная запись числа a( Счётчик букв элементов)
;-----------------------------Замена 1 переменной( х[])---
	For $in=$l1/2 To 1 Step -1
		$s= Chr($k) ; Преобразование числа в букву алфавита( т.к. нельзя считать буквы)
		$zam1='x['&$inp&'] '
		$arr = StringRegExpReplace($arr,'a='&$s&' ',$zam1)
		$arr = StringRegExpReplace($arr,'b='&$s&' ',$zam1)
		$arr = StringRegExpReplace($arr,'c='&$s&' ',$zam1)
		$arr = StringRegExpReplace($arr,'d='&$s&' ',$zam1)
		$arr = StringReplace($arr,".gate ", "")
		$k=$k+1
		$inp=$inp+1
	Next
;-----------------------------Замена 2 переменной( z[])---
	For $out=$l2/2 To 1 Step -1
		$s= Chr($k)
		$zam2='z['&$outp&']'
		$arr = StringRegExpReplace($arr,'y='&$s,$zam2)
		$k=$k+1
		$outp=$outp+1
	Next
;----------------------------- Выбор индексов 3 переменной ( y[] )---
	For $a= 0 To $max Step +1
		$param=StringInStr($arr,'a=['&$a&']')
		$param=StringInStr($arr,'b=['&$a&']')
		$param=StringInStr($arr,'c=['&$a&']')
		$param=StringInStr($arr,'d=['&$a&']')
		$param=StringInStr($arr,'y=['&$a&']')
;----------------------------Запись их в вспомогательный массив arr1--
		If $param>0 Then
				$arr1=$a
				$j1=$j1+1
				FileWriteLine($y_var, $arr1 & @CRLF)
			EndIf
	Next
$int=$int+1
FileWriteLine($output, $arr & @CRLF)
Next
FileClose($y_var)
FileClose($output)
FileClose($input)
$output= FileOpen("132.txt",0)
$output2= FileOpen("000.txt",2)
;---------------------Замена 3 переменной ( y[] )-----
For $i=$n To 0 Step -1
	$arr= FileReadLine($output) ; Заполнение массива заново из выходного файла
	$y_var= FileOpen("111.txt",0) ; Открытие файла 3 переменной
		For $m= $j1 To 1 Step -1 ; от $j1 строки до 0
		$arr1 = FileReadLine($y_var) ; Заполнение массива заново из файла 3 переменной
		$zam3='y['&$m&']'
		$arr = StringRegExpReplace($arr,'y=.'&$arr1&'.',$zam3)
		$arr = StringRegExpReplace($arr,'a=.'&$arr1&'.',$zam3)
		$arr = StringRegExpReplace($arr,'b=.'&$arr1&'.',$zam3)
		$arr = StringRegExpReplace($arr,'c=.'&$arr1&'.',$zam3)
		$arr = StringRegExpReplace($arr,'d=.'&$arr1&'.',$zam3)
		;MsgBox(0,"1",$arr&"  "&$zam3&"  "&$arr1&"  "&$m)
		Next
	FileClose($y_var)
	FileWriteLine($output2, $arr & @CRLF)
Next
Прошу прощения за его качество.

После этого планирую как-то с помощью If и того же StringRegExpReplace

привести к нужному виду.

UPD1. Первую проблему исправил, осталась вторая.

Придумал решение в 111.txt пишем не число, а [число]
и тогда RegExp будет 'y='&$arr1, но тогда он ничего не меняет. Варианты?
 

madmasles

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


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