Что нового

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

Atall

Новичок
Сообщения
27
Репутация
0
Доброго дня!

Помогите плз решить задачку, есть файл с текстом:
[box title=TitleBox]
<Ordinate X="476367" Y="546745756" Ord_Nmb="1" />
<Ordinate X="3457347" Y="45764576" Ord_Nmb="2" />
</Spelement_Unit>
<Spelement_Unit Type_Unit="Line" Su_Nmb="2">
<Ordinate X="45674567" Y="7877868" Ord_Nmb="16" />
<Ordinate X="6785678" Y="34566834" Ord_Nmb="4" />
</Spelement_Unit>
<Spelement_Unit Type_Unit="Line" Su_Nmb="3">
<Ordinate X="3456456" Y="45693456" Ord_Nmb="5" />
<Ordinate X="4576576" Y="45674567" Ord_Nmb="10" />
</Spelement_Unit>
<Spelement_Unit Type_Unit="Line" Su_Nmb="4">
<Ordinate X="45674567" Y="4674567" Ord_Nmb="12" />
<Ordinate X="34563456" Y="3456345" Ord_Nmb="338" />
[/box]
цифры выделенные красным могут быть любые

а нужно что бы он выглядел вот так:
[box title=TitleBox]
<Ordinate X="476367" Y="546745756" Ord_Nmb="1" />
<Ordinate X="3457347" Y="45764576" Ord_Nmb="2" />
</Spelement_Unit>
<Spelement_Unit Type_Unit="Line" Su_Nmb="2">
<Ordinate X="45674567" Y="7877868" Ord_Nmb="1" />
<Ordinate X="6785678" Y="34566834" Ord_Nmb="2" />
</Spelement_Unit>
<Spelement_Unit Type_Unit="Line" Su_Nmb="3">
<Ordinate X="3456456" Y="45693456" Ord_Nmb="1" />
<Ordinate X="4576576" Y="45674567" Ord_Nmb="2" />
</Spelement_Unit>
<Spelement_Unit Type_Unit="Line" Su_Nmb="4">
<Ordinate X="45674567" Y="4674567" Ord_Nmb="1" />
<Ordinate X="34563456" Y="3456345" Ord_Nmb="2" />
[/box]
То есть нужно заменить цифры в конце строки в этом же файле
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
Atall
Попробуйте так:
Код:
#include <Array.au3>

$sPattern = '(?s).*?\QOrd_Nmb="\E(.*?)\Q" />\E.*'
$hFile = FileOpen(@ScriptDir & '\Test.txt', 0)

$sText = FileRead($hFile)
$aText = StringSplit($sText, @LF)
;_ArrayDisplay($aText)
For $i = 1 To $aText[0]
	If StringInStr($aText[$i - 1], '<Ordinate X="') And StringInStr($aText[$i], '<Ordinate X="') Then
		$aText[$i - 1] = StringReplace($aText[$i - 1], StringRegExpReplace($aText[$i - 1], $sPattern, '\1'), '1', -1)
		$aText[$i] = StringReplace($aText[$i], StringRegExpReplace($aText[$i], $sPattern, '\1'), '2', -1)
	EndIf
Next

_ArrayDisplay($aText)
 
Автор
A

Atall

Новичок
Сообщения
27
Репутация
0
Через _ArrayDisplay показывает верно, но нужно чтобы скрипт изменял эти строки в этом же файле.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
622
Atall
Полученный результат пишешь во временный файл. Удаляешь оригинальный файл. Переименовываешь временный файл в оригинальный файл
 
Автор
A

Atall

Новичок
Сообщения
27
Репутация
0
А в этом же файле не возможна замена?

просто в файле еще много другого текста
 

Vlasssov

Осваивающий
Сообщения
430
Репутация
25
Kaster сказал(а):
Atall
Полученный результат пишешь во временный файл. Удаляешь оригинальный файл. Переименовываешь временный файл в оригинальный файл
Открываешь файл для чтения, переносишь все в текстовую переменную, меняешь в текстовой переменной текст, сохраняешь файл с таким же именем. Он переписывается.
Вообще тема заинтересовала: а такой механизм есть изменения файла, без создания рабочей переменной в памяти? Например просмотр кусками, и последующая запись?
 
Автор
A

Atall

Новичок
Сообщения
27
Репутация
0
Vlasssov сказал(а):
Kaster сказал(а):
Atall
Полученный результат пишешь во временный файл. Удаляешь оригинальный файл. Переименовываешь временный файл в оригинальный файл
Открываешь файл для чтения, переносишь все в текстовую переменную, меняешь в текстовой переменной текст, сохраняешь файл с таким же именем. Он переписывается.
Вообще тема заинтересовала: а такой механизм есть изменения файла, без создания рабочей переменной в памяти? Например просмотр кусками, и последующая запись?

Спасибо за ответ, но можно поподробнее с момента открытия файла и переноса в текстовую переменную...
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Можно так : (может не очень красиво)
Код:
$sStr=ClipGet();Исходный текст
$sPattern='(?s)(.+?)\d+(" />)(.+?)\d+(" />)'
$sRez=StringReplace(StringReplace(StringRegExpReplace($sStr,$sPattern,"\1a\2\3b\4"),'"a"','"1"'),'"b"','"2"')
ConsoleWrite($sRez & @LF)
 
Автор
A

Atall

Новичок
Сообщения
27
Репутация
0
Как сохранить полученный результат в файл?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
964
Atall
Что-то подсказывает мне, что исходный файл это XML?
Если так, тогда XPath вам поможет! ;)
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Atall [?]
Как сохранить полученный результат в файл?

Код:
$file = FileOpen("test.txt", 2)

; Check if file opened for writing OK
If $file = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
EndIf

FileWrite($file, $sRez)
FileClose($file)
 
Автор
A

Atall

Новичок
Сообщения
27
Репутация
0
Atall
Что-то подсказывает мне, что исходный файл это XML?
Если так, тогда XPath вам поможет!
Да это XML но с XPath пока не дружу.

Тогда еще вопрос ;D
Как сделать автоматическую замену файла оригинала?
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Atall [?]
Как сделать автоматическую замену файла оригинала?
Вот весь процесс :
Код:
$hFile = FileOpen("test.txt", 0)
If $hFile = -1 Then
    MsgBox(0, "Error", "Невозможно открыть файл.")
    Exit
EndIf
$sText=FileRead($hFile)
FileClose($hFile)
MsgBox(0,'$sText',$sText)

$sPattern='(?s)(.+?)\d+(" />)(.+?)\d+(" />)'
$sRez=StringReplace(StringReplace(StringRegExpReplace($sText,$sPattern,"\1a\2\3b\4"),'"a"','"1"'),'"b"','"2"')
$hFile = FileOpen("test.txt", 2)
FileWrite($hFile, $sRez)
FileClose($hFile)

$hFile = FileOpen("test.txt", 0)
$sText=FileRead($hFile)
FileClose($hFile)
MsgBox(0,'Новый текст',$sText)
 
Автор
A

Atall

Новичок
Сообщения
27
Репутация
0
а если название файла нельзя вписать заранее так как оно не известно, то как это можно изобразить?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
622
Учитывая, что автор темы не приложил ни малейших усилий к разработке кода, предлагаю переместить тему в раздел Заказов.
Что скажу участники и сам автор?
 
Автор
A

Atall

Новичок
Сообщения
27
Репутация
0
Все разобрался!

Благодарю Вас господа... помогли :beer:
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
622
Atall
Если вопрос исчерпан, не стесняйся отмечать тему решенной
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Kaster [?]
Учитывая, что автор темы не приложил ни малейших усилий к разработке кода, предлагаю переместить тему в раздел Заказов.
Что скажу участники и сам автор?
Полностью поддерживаю
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
622
gregaz [?]
Полностью поддерживаю
тема решена. уже нет надобности.
но, на будущее, Atall, если не собираешься конструктивно участвовать в решении проблемы, то пользуйся вот этим разделом http://autoit-script.ru/index.php/board,8.0.html
В этом нет ничего зазорного.
 

Vlasssov

Осваивающий
Сообщения
430
Репутация
25
Atall сказал(а):
Vlasssov сказал(а):
Kaster сказал(а):
Atall
Полученный результат пишешь во временный файл. Удаляешь оригинальный файл. Переименовываешь временный файл в оригинальный файл
Открываешь файл для чтения, переносишь все в текстовую переменную, меняешь в текстовой переменной текст, сохраняешь файл с таким же именем. Он переписывается.
Вообще тема заинтересовала: а такой механизм есть изменения файла, без создания рабочей переменной в памяти? Например просмотр кусками, и последующая запись?

Спасибо за ответ, но можно поподробнее с момента открытия файла и переноса в текстовую переменную...
Код:
$test = "C:\myfile.txt"
;Определяем размер файла вбайтах
$size = FileGetSize($test)
;Заносим в переменную
$file = FileRead($test,$size)
 
Верх