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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Замена слов из списка (http://forum.oszone.net/showthread.php?t=237096)

aggressor_ 21-06-2012 22:02 1938455

Замена слов из списка
 
Здравствуйте,
есть файл list.txt, который содержит в себе 3 строки, всегда разные, вот пример одного из файлов
Код:

someaddress@mail.ru
тел. 43242342
ул.Красная 10 Караганда

Эту информацию нужно распределить по файлам в определённое место.
Грубо говоря найти слово "_something_" и заменить это слово на первую строку из файла list.txt, найти "_something2_" и заменить на вторую строку из файла и т.д.
Можно ли как-нибудь с помощью скрипта пробежаться по файлам в папке, включая подпапки, найти эти "анкоры" и заменить текст?

DmitriiV 22-06-2012 07:05 1938562

Можно, но нужно знать критерий, согласно которому выполняется замена.

aggressor_ 22-06-2012 13:41 1938737

Цитата:

Цитата DmitriiV
Можно, но нужно знать критерий, согласно которому выполняется замена. »

Допустим есть в папке 40 xml файлов. С помощью скрипта нужно просканировать эти файлы на наличие определённого слова и заменить его из списка.
_something1_ => someaddress(@)mail.ru (1 строчка из списка)
_something2_ => тел. 43242342 (2 строчка из списка)
_something3_ => ул.Красная 10 Караганда (3 строчка из списка)
Либо же напрямую обращаться к файлу, прописав путь.

DmitriiV 22-06-2012 17:00 1938897

1. По-моему, задачи из Ваших сообщений не идентичны.
2. Что значит: "Либо же напрямую обращаться к файлу, прописав путь"?

aggressor_ 22-06-2012 17:33 1938915

Задачи идентичны. Просто немного переформулированы.
Цитата:

Цитата DmitriiV
Что значит: "Либо же напрямую обращаться к файлу, прописав путь"? »

Это значит, что я знаю в каких именно файлах будут находиться эти анкоры, которые будет заменять скрипт. Т.е. можно либо просканировать папку и заменить слова в файлах, либо же прописать путь к каждому из необходимых файлов.

SendMessage 24-06-2012 08:31 1939612

Код:

Option Explicit
 
Dim objFSO
Dim objShApp
Dim objWshSh
Dim strMask
Dim CurrFolderPath
Dim strFileP
Dim OpenFile
Dim nLine
Dim strLine(2)
Dim strRepl(2)
 
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objShApp = WScript.CreateObject("Shell.Application")
Set objWshSh = CreateObject("WScript.Shell")

' поместите файл скрипта в каталог, который нужно обработать
CurrFolderPath = objWshSh.CurrentDirectory
' маска обрабатываемых файлов
strMask = "*.txt; *.htm"
' файл-образец для замены
strFileP = "z:\list.txt"
' заменяемые выражения
strRepl(0) = "_something1_"
strRepl(1) = "_something2_"
strRepl(2) = "_something3_"

Set OpenFile = objFSO.OpenTextFile(strFileP, 1)
  Do Until OpenFile.AtEndOfStream = True Or nLine = 2
      nLine = OpenFile.Line - 1
      strLine(nLine) = OpenFile.ReadLine
  Loop
OpenFile.Close

If nLine < 2 Then
  MsgBox "Некорректный файл-образец"
Else
  GetFiles objFSO.GetFolder(CurrFolderPath)
End If

Set objFSO = Nothing
Set objShApp = Nothing
Set objWshSh = Nothing

MsgBox "Скрипт завершил обработку каталога"

WScript.Quit
 
Sub GetFiles(objFolder)
  Dim SubFolderItem
    ReplaceTextToFiles(objFolder.Path)
    For Each SubFolderItem In objFolder.SubFolders
      GetFiles SubFolderItem
    Next
End Sub
 
Sub ReplaceTextToFiles(strPath)
  Dim arrFiles
  Dim i, n
  Dim strItemFile
  Dim strText 
    Set arrFiles = objShApp.NameSpace(strPath).Items
    arrFiles.Filter 192, strMask
    For i = 0 To arrFiles.Count - 1
      strItemFile = arrFiles.Item(i).Path
      Set OpenFile = objFSO.OpenTextFile(strItemFile, 1)
        strText = OpenFile.ReadAll
      OpenFile.Close
      For n = 0 To 2
        strText = Replace(strText, strRepl(n), strLine(n), 1, -1, 1)
      Next
      Set OpenFile = objFSO.OpenTextFile(strItemFile, 2)
        OpenFile.Write strText
      OpenFile.Close
    Next
End Sub


aggressor_ 25-06-2012 15:46 1940238

Большое спасибо! То что надо!
Этот скрипт ограничен только 3 заменами, а можно добавить strRepl(3) = "_something4_" для четвёртой замены или этого мало и нужно будет ещё корректировать скрипт?

SendMessage 26-06-2012 01:14 1940490

Цитата:

Цитата aggressor_
Этот скрипт ограничен только 3 заменами, а можно добавить strRepl(3) = "_something4_" для четвёртой замены или этого мало и нужно будет ещё корректировать скрипт? »

Да, нужно.
читать дальше »
Код:

Option Explicit
 
Dim objFSO
Dim objShApp
Dim objWshSh
Dim strMask
Dim CurrFolderPath
Dim strFileP
Dim OpenFile
Dim nLine
Dim strLine()
Dim strRepl()
Dim nReplaceItems
 
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objShApp = WScript.CreateObject("Shell.Application")
Set objWshSh = CreateObject("WScript.Shell")

' количество заменяемых пунктов (минус 1 пункт)
nReplaceItems = 3

ReDim strLine(nReplaceItems)
ReDim strRepl(nReplaceItems)

' поместите файл скрипта в каталог, который нужно обработать
CurrFolderPath = objWshSh.CurrentDirectory
' маска обрабатываемых файлов
strMask = "*.txt; *.htm"
' файл-образец для замены
strFileP = "z:\list.txt"
' заменяемые выражения
strRepl(0) = "_something1_"
strRepl(1) = "_something2_"
strRepl(2) = "_something3_"
strRepl(3) = "_something4_"

Set OpenFile = objFSO.OpenTextFile(strFileP, 1)
  Do Until OpenFile.AtEndOfStream = True Or nLine = nReplaceItems
      nLine = OpenFile.Line - 1
      strLine(nLine) = OpenFile.ReadLine
  Loop
OpenFile.Close

If nLine < nReplaceItems Then
  MsgBox "Некорректный файл-образец"
Else
  GetFiles objFSO.GetFolder(CurrFolderPath)
End If

Set objFSO = Nothing
Set objShApp = Nothing
Set objWshSh = Nothing

MsgBox "Скрипт завершил обработку каталога"


WScript.Quit
 
Sub GetFiles(objFolder)
  Dim SubFolderItem
    ReplaceTextToFiles(objFolder.Path)
    For Each SubFolderItem In objFolder.SubFolders
      GetFiles SubFolderItem
    Next
End Sub
 
Sub ReplaceTextToFiles(strPath)
  Dim arrFiles
  Dim i, n
  Dim strItemFile
  Dim strText 
    Set arrFiles = objShApp.NameSpace(strPath).Items
    arrFiles.Filter 192, strMask
    For i = 0 To arrFiles.Count - 1
      strItemFile = arrFiles.Item(i).Path
      MsgBox strItemFile
      Set OpenFile = objFSO.OpenTextFile(strItemFile, 1)
        strText = OpenFile.ReadAll
      OpenFile.Close
      For n = 0 To nReplaceItems
        strText = Replace(strText, strRepl(n), strLine(n), 1, -1, 1)
      Next
      Set OpenFile = objFSO.OpenTextFile(strItemFile, 2)
        OpenFile.Write strText
      OpenFile.Close
    Next
End Sub

В выделенное красным вставляйте нужное количество строк для замены (минус 1). И, соответственно, добавляйте (или убирайте) заменяемые строчки

aggressor_ 26-06-2012 01:18 1940491

Если я верно понял, то теперь можно просто менять значение nReplaceItems = ... и добавлять strRepl(...) = "..." столько, сколько мне нужно? Никаких ограничений на символы нет в заменяемом тексте?

SendMessage 26-06-2012 01:26 1940492

Насчет ограничений на символы не очень понял.
В остальном - да. Но не стоит выходить за рамки количества нужных строк в файле-образце.

aggressor_ 26-06-2012 01:35 1940494

Цитата:

Цитата SendMessage
Насчет ограничений на символы не очень понял. »

!"№#@:"^&$% и т.д. они все будут перемещаться из файла образца и скрипт не будет обрезать или игнорировать их?

SendMessage 26-06-2012 01:41 1940496

Должны все. Но можно ведь и проверить. Это не сложно.

Iska 26-06-2012 02:17 1940503

2SendMessage, оффтопиком:
читать дальше »
Так:
Код:

Dim arrRepl

arrRepl = Array("_something1_", "_something2_", "_something3_", "_something4_")

For Each elem In arrRepl
'или
'For i = LBound(arrRepl) To Ubound(arrRepl)

удобнее.


Время: 11:57.

Время: 11:57.
© OSzone.net 2001-2025