Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Найти и заменить в текстовом файле. Как? (http://forum.oszone.net/showthread.php?t=163394)

Pozia 13-01-2010 18:55 1319336

Найти и заменить в текстовом файле. Как?
 
Есть текстовый файл 1.txt. Мне нужно найти в нем определенной слово и заменить его на имя компьютера с которого производится запуск скрипта, и после этого создать текстовый файл 2.txt такой же по содержанию но с измененным словом. Как это сделать?

madmasles 13-01-2010 19:21 1319357

У меня так получилось:

Код:

$sPathOld = "1.txt"
$sPathNew = "2.txt"
$slovo = "" ; Ваше слово для замены

$sTest = FileRead($sPathOld)
$sTest = StringReplace($sTest, $slovo, @ComputerName)
FileWrite($sPathNew, $sTest)


Pozia 27-02-2010 00:56 1357005

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>

но не могу сообразить как скрипт написать. помогите пожалуйста

madmasles 27-02-2010 07:16 1357079

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)


Pozia 27-02-2010 10:15 1357159

madmasles, вы не учли:
Цитата:

Цитата Pozia
Но загвоздка в том что во всем тексте скрипта properties повторяется несколько раз »

Получилось так что произошла замена по всему моему скрипту. Нужно как то вставить проверку наличия строки <Name xlate="true" UID="ACAD_334">Properties</Name> после которой идет именно та properties что мне нужно изменить. Как это сделать?

madmasles 27-02-2010 10:27 1357165

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)

Мой предыдущий код в примере Вашего текста работал (у меня).

Pozia 27-02-2010 10:43 1357174

madmasles, в яблочко! Спасибо огромное за оперативность! :)

Pozia 27-02-2010 11:04 1357189

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)

но чувствую что это сильно по ламерски с удалением промежуточного файла. Хотелось бы сразу конечный результат

madmasles 27-02-2010 11:51 1357240

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)


Pozia 05-03-2010 17:43 1361882

madmasles, еще маленький вопросик. не могу сообразить как дать определенному файлу имя текущей учетной записи. Подскажите пожалуйста.

madmasles 06-03-2010 04:07 1362185

Pozia,
Попробуйте так
Код:

$hUser = FileOpen(@ScriptDir & "\" & @UserName & ".txt",2) ;создать новый файл с именем текущего пользователя.
FileWrite($hUser, "Текущий пользователь - " & @UserName) ;записать в него текущего пользователя.
FileClose($hUser) ;закрыть его.
; ..........

FileMove(@ScriptDir & "\1.txt", @ScriptDir & "\" & @UserName & ".txt") ;переименовать существующий файл.


Pozia 09-03-2010 19:10 1364588

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. Такое возможно?

madmasles 09-03-2010 19:49 1364626

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".

Pozia 09-03-2010 20:49 1364685

Цитата:

Цитата madmasles
Не могу проверить на 64 системе »

завтра на работе проверю. спасибо.

madmasles, аподскажите еще как объеденить приведенный Вами скрипт и мой из поста 12 в один на подобие как вы сделали в посте 9. Сам никак не соображу. Сложновато.

madmasles 09-03-2010 22:20 1364762

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
Сам проверил - у меня так работает.

Pozia 11-03-2010 19:12 1366403

Цитата:

Цитата madmasles
Не могу проверить на 64 системе. »

все нормально работает. спасибо еще раз.


Время: 21:37.

Время: 21:37.
© OSzone.net 2001-