-
AutoIt
(
http://forum.oszone.net/forumdisplay.php?f=103)
Найти и заменить в текстовом файле. Как?
Есть текстовый файл 1.txt. Мне нужно найти в нем определенной слово и заменить его на имя компьютера с которого производится запуск скрипта, и после этого создать текстовый файл 2.txt такой же по содержанию но с измененным словом. Как это сделать?
|
У меня так получилось:
Код:
$sPathOld = "1.txt"
$sPathNew = "2.txt"
$slovo = "" ; Ваше слово для замены
$sTest = FileRead($sPathOld)
$sTest = StringReplace($sTest, $slovo, @ComputerName)
FileWrite($sPathNew, $sTest)
|
madmasles, задача несколько усложнилось. Имеется такой кусок кода:
Код:
...
<MenuMacro UID="ID_Ai_propch">
<Macro type="Modify">
<Revision MajorVersion="16" MinorVersion="2" UserVersion="0" />
<ModifiedRev MajorVersion="16" MinorVersion="2" UserVersion="0" />
<Name xlate="true" UID="ACAD_334">Properties</Name>
<Command>^C^C_properties </Command>
<HelpString xlate="true" UID="ACAD_1440">Controls properties of existing objects: PROPERTIES</HelpString>
<SmallImage Name="RCDATA_16_MODIFY" />
<LargeImage Name="RCDATA_16_MODIFY" />
</Macro>
</MenuMacro>
...
в нем всего лишь нужно поменять выделеное слово на dim_edit. Но загвоздка в том что во всем тексте скрипта properties повторяется несколько раз, а мне необходимо поменять только в данном куске кода. Уникальным сочитанием кода будет:
Код:
<Name xlate="true" UID="ACAD_334">Properties</Name>
<Command>^C^C_properties </Command>
но не могу сообразить как скрипт написать. помогите пожалуйста
|
Pozia,
У меня так получилось:
Код:
#include <file.au3>
$sPathOld = "test.txt" ; файл-источник
$sPathNew = "New.txt" ; файл-результат
$slovoOld = "properties" ; это слово меняем
$slovoNew = "dim_edit" ; на это слово
$sLeft = "<Command>^C^C" ; это слово есть слева
$sRight = " </Command>" ; это слово есть справа
Dim $aFile
_FileReadToArray($sPathOld, $aFile)
For $i = 1 To UBound($aFile) - 1
If StringInStr($aFile[$i], $sLeft) > 0 And StringInStr($aFile[$i], $sRight) > 0 _
And StringInStr($aFile[$i], $slovoOld) > 0 Then
$aFile[$i] = StringReplace($aFile[$i], $slovoOld, $slovoNew)
EndIf
Next
_FileWriteFromArray($sPathNew, $aFile, 1)
|
madmasles, вы не учли:
Цитата:
Цитата Pozia
Но загвоздка в том что во всем тексте скрипта properties повторяется несколько раз »
|
Получилось так что произошла замена по всему моему скрипту. Нужно как то вставить проверку наличия строки <Name xlate="true" UID="ACAD_334">Properties</Name> после которой идет именно та properties что мне нужно изменить. Как это сделать?
|
Pozia,
Попробуйте так:
Код:
#include <file.au3>
$sPathOld = "test.txt" ; файл-источник
$sPathNew = "New.txt" ; файл-результат
$slovoOld = "properties" ; это слово меняем
$slovoNew = "dim_edit" ; на это слово
$sString = '<Name xlate="true" UID="ACAD_334">Properties</Name>' ; это строка сверху
Dim $aFile
_FileReadToArray($sPathOld, $aFile)
For $i = 1 To UBound($aFile) - 1
If StringInStr($aFile[$i], $sString) > 0 Then
$aFile[$i + 1] = StringReplace($aFile[$i + 1], $slovoOld, $slovoNew)
EndIf
Next
_FileWriteFromArray($sPathNew, $aFile, 1)
Мой предыдущий код в примере Вашего текста работал (у меня).
|
madmasles, в яблочко! Спасибо огромное за оперативность! :)
|
madmasles, прошу еще помощи маленькой. я Вашим скрипт в моем коде меняю две строки. Сча не могу сообразить как эти два скрипта в один объединить. Первый что вы привели, второй:
Код:
$sPathOld = 'acad.CUI'
$sPathNew = 'acad2.CUI'
$slovo1 = " <PartialMenuFile>custom.cui</PartialMenuFile>"
$slovo2 = " <PartialMenuFile>custom.cui</PartialMenuFile> <PartialMenuFile>Pozia_Tools\pozia.cui</PartialMenuFile>"
$sTest = FileRead($sPathOld)
$sTest = StringReplace($sTest, $slovo1, $slovo2)
FileWrite($sPathNew, $sTest)
madmasles, сделал так методом тыка:
Код:
#include <file.au3>
$sPath1 = 'acad.CUI'
$sPath2 = 'acad2.CUI'
$sPath3 = 'acad3.CUI'
$slovo1 = " <PartialMenuFile>custom.cui</PartialMenuFile>"
$slovo2 = " <PartialMenuFile>custom.cui</PartialMenuFile> <PartialMenuFile>Pozia_Tools\pozia.cui</PartialMenuFile>"
$slovo3 = "properties"
$slovo4 = "dim_edit"
$sString = '<Name xlate="true" UID="ACAD_334">Properties</Name>'
$sTest = FileRead($sPath1)
$sTest = StringReplace($sTest, $slovo1, $slovo2)
FileWrite($sPath2, $sTest)
Dim $aFile
_FileReadToArray($sPath2, $aFile)
For $i = 1 To UBound($aFile) - 1
If StringInStr($aFile[$i], $sString) > 0 Then
$aFile[$i + 1] = StringReplace($aFile[$i + 1], $slovo3, $slovo4)
EndIf
Next
_FileWriteFromArray($sPath3, $aFile, 1)
FileDelete($sPath2)
но чувствую что это сильно по ламерски с удалением промежуточного файла. Хотелось бы сразу конечный результат
|
Pozia,
Попробуйте так:
Код:
#include <file.au3>
$sPath1 = 'acad.CUI'
$sPath3 = 'acad3.CUI'
$slovo1 = " <PartialMenuFile>custom.cui</PartialMenuFile>"
$slovo2 = " <PartialMenuFile>custom.cui</PartialMenuFile> <PartialMenuFile>Pozia_Tools\pozia.cui</PartialMenuFile>"
$slovo3 = "properties"
$slovo4 = "dim_edit"
$sString = '<Name xlate="true" UID="ACAD_334">Properties</Name>'
Dim $aFile
_FileReadToArray($sPath1, $aFile)
For $i = 1 To UBound($aFile) - 1
If StringInStr($aFile[$i], $slovo1) > 0 Then
$aFile[$i] = StringReplace($aFile[$i], $slovo1, $slovo2)
EndIf
If StringInStr($aFile[$i], $sString) > 0 Then
$aFile[$i + 1] = StringReplace($aFile[$i + 1], $slovo3, $slovo4)
EndIf
Next
_FileWriteFromArray($sPath3, $aFile, 1)
|
madmasles, еще маленький вопросик. не могу сообразить как дать определенному файлу имя текущей учетной записи. Подскажите пожалуйста.
|
madmasles, я наверное Вас уже утомил :sorry: Нужна опять помощь. Есть файл реестра. В нем я меняю слово PoziaMark на имя запущенной учетной записи. Скрипт такой:
Код:
; Определение Имени учетной записи
$sPathOld = ".\Setting\Set.reg"
$sPathNew = "SetNew.reg"
$slovo = "PoziaMark";
$sTest = FileRead($sPathOld)
$sTest = StringReplace($sTest, $slovo, @UserName)
FileWrite($sPathNew, $sTest)
Мне нужно его дописать чтобы скрипт еще определял какая разрядность системы (32 или 64) и менял Program Files Mark на Program Files в случае 32 разрядной системы или на Program Files (x86) при 64. Такое возможно?
|
Pozia,
Ничего страшного. :) Попробуйте так
Код:
$sPathOld = @ScriptDir & "\1.txt"
$sPathNew = @ScriptDir & "\2.txt"
$slovoOld = "Program Files Mark"
$slovoNew32 = "Program Files"
$slovoNew64 = "Program Files (x86)"
$sTest = FileRead($sPathOld)
$ras = @OSArch ;макрос разрядности
If $ras = "X86" Then
$sTest = StringReplace($sTest, $slovoOld, $slovoNew32)
Else
$sTest = StringReplace($sTest, $slovoOld, $slovoNew64)
EndIf
FileWrite($sPathNew, $sTest)
Не могу проверить на 64 системе. В справке говорится, что макрос @OSArch возвращает "x86" или "ia64" или "x64". Не знаю что такое "ia64".
|
Цитата:
Цитата madmasles
Не могу проверить на 64 системе »
|
завтра на работе проверю. спасибо.
madmasles, аподскажите еще как объеденить приведенный Вами скрипт и мой из поста 12 в один на подобие как вы сделали в посте 9. Сам никак не соображу. Сложновато.
|
Pozia,
Примерно так:
Код:
$sPathOld = ".\Setting\Set.reg"
$sPathNew = "SetNew.reg"
$slovo = "PoziaMark"
$slovoOld = "Program Files Mark"
$slovoNew32 = "Program Files"
$slovoNew64 = "Program Files (x86)"
$sTest = FileRead($sPathOld)
$sTest = StringReplace($sTest, $slovo, @UserName)
$ras = @OSArch
If $ras = "X86" Then
$sTest = StringReplace($sTest, $slovoOld, $slovoNew32)
Else
$sTest = StringReplace($sTest, $slovoOld, $slovoNew64)
EndIf
FileWrite($sPathNew, $sTest)
Только меня смущает это:
Цитата:
$sPathOld = ".\Setting\Set.reg"
|
Вы проверяли, так работает?
PS
Сам проверил - у меня так работает.
|
Цитата:
Цитата madmasles
Не могу проверить на 64 системе. »
|
все нормально работает. спасибо еще раз.
|
Время: 21:37.
© OSzone.net 2001-