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

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

v79italya 02-05-2022 20:17 2984275

Заменить в файле xml значения по справочнику
 
Вложений: 1
Здравствуйте
Возможно ли скриптом проделать следующее: заменить значения в файле xml по справочнику. Справочник в файле Лист Microsoft Excel.xlsm в таблице SNMPDiscovery. Желательно чтобы данные справочника брались из умной таблицы

Serguei Kouzmine 03-05-2022 02:11 2984300

скрипт на повершел можно написать чтобы это сделать

v79italya 03-05-2022 08:44 2984308

Паувэр шелл тоже подходит.
Только я сам не смогу написать, т.к. не умею
Прошу помочь.
Сейчас эту задачу выполняю вручную в Нотепадд++. Двадцать-тридцать замен не очень напрягает. Но есть вероятность что замен будет более пятидесяти раз. Благо это нужно всего два-три раза в месяц

megaloman 03-05-2022 12:01 2984318

v79italya, .vbs
Код:

Option Explicit

Dim FileXLS: FileXLS = "Z:\Box_In\папка\Лист Microsoft Excel.xlsm"
Dim BeginXLS: BeginXLS = "A2"
Dim FileXMLin: FileXMLin = "Z:\Box_In\папка\SNMPDiscovery.xml"
Dim FileXMLout: FileXMLout = "Z:\Box_In\папка\SNMPDiscoveryOut.xml"

Dim Mass, i, i1, i2, j2
Dim AllTxt

MsgBox "Begin"
With CreateObject("Excel.Application")
    .Visible = False 'True
    .Workbooks.Open FileXLS
    Mass = .Range(.Range(BeginXLS), .Range(BeginXLS).Offset(0, 1).End(-4121))
    .Quit
End With

i1 = LBound(Mass, 1)
i2 = UBound(Mass, 1)
j2 = UBound(Mass, 2)

With CreateObject("Scripting.FileSystemObject")
    With .OpenTextFile(FileXMLin, 1, False)
        AllTxt = .ReadAll
        .Close
    End With
   
    For i = i1 To i2
        AllTxt = Replace(AllTxt, Mass(i, i1), Mass(i, j2))
    Next
   
    With .OpenTextFile(FileXMLout, 2, True)
        .Write AllTxt
        .Close
    End With
End With
MsgBox "Done"


v79italya 03-05-2022 12:57 2984319

Вложений: 1
megaloman, спасибо за скрипт!
С кириллицей в пути или в имени файла не захотел работать. Но это не беда
А вот с этим справочником почему не хочет работать? 12 замен сделало и все
ps предупрежу что в последней строке справочника Номер 1 заменяется на vv. Это я проверял будет ли происходить замена если в одном искомом значении есть часть другого искомого значения. Будет

megaloman 03-05-2022 16:10 2984348

Вложений: 1
v79italya,
Цитата:

Цитата v79italya
С кириллицей в пути или в имени файла не захотел работать. »

- не надо ляля. Сохраняйте скрипт в 1251 кодировке, у меня же работает. На всякий случай прилагаю свой файл.
Цитата:

Цитата v79italya
А вот с этим справочником почему не хочет работать? 12 замен сделало и все »

Цитата:

Цитата Кто-то из патриархов
Всегда можно подобрать данные, способные одурачить программу

Проблема - в столбце справочника пустые ячейки. Уточняю: в столбце A не должно быть пустых ячеек среди данных. В столбце B - эту ситуацию учел.
Цитата:

Цитата v79italya
если в одном искомом значении есть часть другого искомого значения. »

Больше не будет, если в обрабатываемом файле эти значения в кавычках.
Код:

Option Explicit

Dim FileXLS: FileXLS = "D:\Мой контент\Загрузки\Microsoft Excel.xlsx"
Dim BeginXLS: BeginXLS = "A2"
Dim FileXMLin: FileXMLin = "Z:\Box_In\папка\SNMPDiscovery.xml"
Dim FileXMLout: FileXMLout = "Z:\Box_In\папка\SNMPDiscoveryOut.xml"

Dim Mass, i, i1, i2, j2
Dim AllTxt

MsgBox "Begin"
With CreateObject("Excel.Application")
    .Visible = False 'True
    .Workbooks.Open FileXLS
    Mass = .Range(BeginXLS + ":" + .Range(BeginXLS).End(-4121).Offset(0, 1).Address)
    .Quit
End With

i1 = LBound(Mass, 1)
i2 = UBound(Mass, 1)
j2 = UBound(Mass, 2)

With CreateObject("Scripting.FileSystemObject")
    With .OpenTextFile(FileXMLin, 1, False)
        AllTxt = .ReadAll
        .Close
    End With
   
    For i = i1 To i2
        AllTxt = Replace(AllTxt, """" + Mass(i, i1) + """", """" + Mass(i, j2) + """")
    Next
   
    With .OpenTextFile(FileXMLout, 2, True)
        .Write AllTxt
        .Close
    End With
End With
MsgBox "Done"

Переименуйте мой файл из txt. Пропишите свои пути.

v79italya 03-05-2022 17:46 2984364

megaloman, спасибо еще раз
Цитата:

Цитата megaloman
сли в обрабатываемом файле эти значения в кавычках »

вот этот момент я не до конца понял. Если надо заменить Магазин Продуктов на Продуктовый Магазин, а также заменить Магазин на Ларек и Продукт на Товар, то как следует их в кавычки брать?

megaloman 03-05-2022 17:58 2984366

v79italya, Я в тупике, что Вам надо.
Если в справочнике
Магазин Продуктов и Продуктовый Магазин
скрипт в файле будет искать "Магазин Продуктов" и менять на "Продуктовый Магазин"
"Магазин продуктов №5" уже не поменяется на "Продуктовый магазин" если это в справочнике не прописано.
А иначе как определить, где полное название а где его часть?
Цитата:

будет ли происходить замена если в одном искомом значении есть часть другого искомого значения. Будет
- мы это проходили. Сформулируйте, как определить, как подставить строку. Будем думать.

v79italya 03-05-2022 20:14 2984375

Вложений: 1
megaloman, меня уже все устраивает. Даже первый Ваш скрипт мне подходит(Учитывать отсутствие кириллицы в пути и имени файла не проблема).
А так вот например с чем приходится работать

megaloman 03-05-2022 20:20 2984377

Цитата:

Цитата v79italya
А так вот например с чем приходится работать »

Что это? И что с этого надо поиметь? Не пойму проблему кириллицы в пути и имени файла - нет её. Формулируйте, чтобы можно было решить.

v79italya 03-05-2022 20:33 2984380

megaloman, я же говорю проблема решена.
И даже если б Вы не сказали как лечить(Сохраняйте скрипт в 1251 кодировке) проблему с кириллицей то меня бы устроил и такой вариант.
А текстовый файл я просто показал с чем работать мне приходится. Ничего решать не надо. Уже решено все что нужно было в начале темы

v79italya 19-05-2022 15:35 2985333

megaloman, здравствуйте
Не знаете почему не работает замена?
Все заменяемые значения обернуты в <Description>

megaloman 19-05-2022 19:08 2985347

v79italya, Ваш файл при скачивании блокируется как вредоносный. Не могу его посмотреть

v79italya 19-05-2022 20:00 2985349

В архиве выгрузка справочника из 1с и файл Excel плюс vbs.
По отдельности большой размер выходит, не пропускает.


Я с гугглХром скачиваю свой файл. Ошибка: обнаружен вирус. Там справочник в 2,4 мб

v79italya 19-05-2022 20:12 2985350

Ругается на xlsm. Файл xlsx сделаю по новой

v79italya 19-05-2022 20:19 2985351

xlsx загружаю в архиве т.к. размер тоже большой

v79italya 21-05-2022 19:24 2985439

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

megaloman 21-05-2022 20:13 2985440

v79italya,
Цитата:

Цитата v79italya
заменить значения в файле xml по справочнику. ......значения обернуты в <Description> »

Вы не предоставили xml.

v79italya 22-05-2022 00:45 2985445

Файл xml в архиве Товары.rar.
В файле Excel.rar экселевский файл с таблицей(что менять и на что менять).
Сейчас проверил - эти файлы скачиваются

megaloman 22-05-2022 23:04 2985513

Вложений: 1
v79italya, Вот вариант с UTF-8. Единственное, не понимаю как работает справочник в xlsx, там стоят формула с генерацией случайного соответствия.
Код:

Option Explicit

Dim FileXLS: FileXLS = "Z:\Box_In\Excel.xlsx"
Dim BeginXLS: BeginXLS = "A2"
Dim FileXMLin: FileXMLin = "Z:\Box_In\Товары.xml"

Dim FileXMLout: FileXMLout = "Z:\Box_In\ТоварыOutADO.xml"

Dim Mass, i, i1, i2, j2
Dim AllTxt

MsgBox "Begin"

With CreateObject("Excel.Application")
    .Visible = False 'True
    .Workbooks.Open FileXLS
    Mass = .Range(BeginXLS + ":" + .Range(BeginXLS).End(-4121).Offset(0, 1).Address)
    .DisplayAlerts = False
    .Quit
End With

i1 = LBound(Mass, 1)
i2 = UBound(Mass, 1)
j2 = UBound(Mass, 2)

With CreateObject("ADODB.Stream")
    .Charset = "utf-8"
    .Open
    .LoadFromFile (FileXMLin)
    AllTxt = .ReadText()
    .Close

    For i = i1 To i2
        AllTxt = Replace(AllTxt, ">" + Mass(i, i1) + "<", ">" + Mass(i, j2) + "<")
    Next
   
    .Open
    .WriteText AllTxt
    .SaveToFile FileXMLout, 2
    .Close
End With
MsgBox "Done"


v79italya 23-05-2022 00:01 2985518

Цитата:

Цитата megaloman
как работает справочник в xlsx, там стоят формула с генерацией случайного соответствия »

Данные в первой колонке справочника - реальные данные, выгруженные с 1с. Мне эти данные надо заменить на другие, без разницы какие. Вот формула и меняет на случайное значение. Далее я этот справочник загоняю обратно в 1с, повторяю эти же действия с другими справочниками. И все! У меня есть база данных, по значениям которой я могу построить отчеты и дашборды и показывать их при поиске работы на собеседованиях.

За скрипт спасибо! Опробовал - работает
Удалил конфинфу


Время: 23:48.

Время: 23:48.
© OSzone.net 2001-