Что нового

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

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 319
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

Осваивающий
Сообщения
428
Репутация
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

Осваивающий
Сообщения
428
Репутация
25
Atall сказал(а):
Vlasssov сказал(а):
Kaster сказал(а):
Atall
Полученный результат пишешь во временный файл. Удаляешь оригинальный файл. Переименовываешь временный файл в оригинальный файл
Открываешь файл для чтения, переносишь все в текстовую переменную, меняешь в текстовой переменной текст, сохраняешь файл с таким же именем. Он переписывается.
Вообще тема заинтересовала: а такой механизм есть изменения файла, без создания рабочей переменной в памяти? Например просмотр кусками, и последующая запись?
Спасибо за ответ, но можно поподробнее с момента открытия файла и переноса в текстовую переменную...
Код:
$test = "C:\myfile.txt"
;Определяем размер файла вбайтах
$size = FileGetSize($test)
;Заносим в переменную
$file = FileRead($test,$size)
 
Верх