Головна » Файли » Готові скрипти

Заміна певного значення зразу у багатьох файлах XML
19.01.2019, 14:00

Інколи виникає необхідність змінити якесь значення (наприклад, назву землевласника, назву суміжного землекористувача, назву вулиці тощо) зразу у багатьох файлах. Цей скрипт зробить це за вас.

Після запуску появиться вікно, де треба ввести текст, який потрібно замінити у файлах

Потім текст, на який треба замінити

І виберіть папку, де знаходяться обмінники

В результаті отримаємо повідомлення про результат:

І в результаті у папці з обмінниками буде створена нова папка Оброблені файли, де будуть збережені тільки ті файли, у яких було знайдено та замінено відповідне значення.

При цьому зверніть увагу, що заміну скриптом можна проводити тільки по значеннях, які заключені в один спільний кінцевий тег. Якщо це, наприклад, назва землевласника  (ТОВ "Зелена балка"), то можна так і вводити. Але коли це ПІБ, то спершу треба замінити прізвище, потім ім'я, а потім по батькові. Оскільки вони у файлі XML у різних тегах:
                        <LastName>Шевченко</LastName>
                        <FirstName>Ірина</FirstName>
                        <MiddleName>Ігорівна</MiddleName>

А ось власне і сам скрипт:

$Ext=.xml
$Intut=@Dialog.Ask Введіть, що треба замінити Size=300
$Intut=@ReplaceChar "*$Intut
$Output=@Dialog.Ask Введіть, на що це треба замінити Size=300
$Output=@ReplaceChar "*$Output
$InF=@Dialog.SelectFolder Вкажіть папку з файлами
@If $InF= @Break
@Text.FolderList *$Ext $InF
$C=@Text.Count
@If $C=0 @Break В папці "$InF" відсутні файли $Ext
$LastF=@ExtractFileFolder $InF
$OutF=$InF
@if "$LastF"<>"Оброблені файли" then $OutF=$InF\Оброблені файли
@if "$LastF"<>"Оброблені файли" then @CreateFolder $OutF
@if "$LastF"<>"Оброблені файли" then @CleanFolder $OutF
@Progress.Start $C Роблю... (всього $C файлів)
$I=0
$R=0
%Start
$I=$I+1
@Progress.StepBy 1
@If $I>$C then @Progress.Stop
@If $I>$C then @Run $OutF
@If $I>$C then @Break Заміна проведена у $R файлах із $C! Оброблені файли збережено у папці $OutF
$InF=@Text.Line[$I]
@Text[1].Load $InF
$Text=@Text[1].Text
$Text=@ReplaceChar "*$Text
$Text=@Calc replace("$Text","$Intut","$Output",0,1)
$Text=@DequoteText $Text
$Pos=@Calc Pos("$Output","$Text")
@if $Pos>0 then $R=$R+1
@if $Pos=0 then @Goto %Start
$Text=@ReplaceChar *"$Text
@Text[1].Text $Text
$InF=@ExtractFileName $InF
@Text[1].Save $OutF\$InF
$Progress=@Progress.Canceled
@if $Progress=1 then @Break Перервано! Оброблено $I файлів із $C.||Заміна проведена у $R файлах! Оброблені файли збережено у папці $OutF
@Goto %Start

Підказка: якщо у ваших файлах заповнено усе по-різному, або взагалі не заповнено, а ви хочете заповнити усе зразу однаковим значенням, то тоді при заміні вказуйте не значення, а сам тег. Наприклад:

</ProprietorCode>

замінити на:

22</ProprietorCode>

При цьому важливо, щоб теги (чи декілька тегів в купі) були оригінальні, тобто, щоб більше ніде не повторювалися по тексту.

Категорія: Готові скрипти | Додав: Микола
Переглядів: 2413 | Завантажень: 0 | Коментарі: 16 | Рейтинг: 0.0/0
Всього коментарів: 16
avatar
15 Санек • 14:24, 16.01.2020
Щиро Вам дякую! За іконки зрозумів, а от з заміною щось не виходить! Пише оброблено 0 файлів.
avatar
0
16 Микола • 15:52, 16.01.2020
копіюйте набір тегів, які треба знайти і видалити безпосередньо з обмінника, відкривши його у блокноті, бо на сайт міг закрастися якийсь зайвий пробіл, чи навпаки не вистачає якогось символу. Це все треба уважно звірити, бо інакше скрипт не знайде потрібний текст. І зверніть увагу, що ці теги тільки для юридичних суміжників. Для фізичних вони у вас, напевне, інші.
avatar
12 Санек • 20:18, 15.01.2020
Також підкажіть, будь ласка, чи можливо якось масово зробити суміжників у файлах такого вигляду: <Proprietor><LegalEntity><Name>землі комунальної власності не надані у власність або користування</Name></LegalEntity></Proprietor> замість  <Proprietor><LegalEntity><Name>землі комунальної власності не надані у власність або користування</Name><EDRPOU/><Address><Country>804</Country><Region/><District/><Settlement/><Street/><Building/></Address></LegalEntity></Proprietor>, тобто прибрати зайве за допомогою Вашого скрипта?!
avatar
0
14 Микола • 12:56, 16.01.2020
Міняйте </Name><EDRPOU/><Address><Country>804</Country><Region/><District/><Settlement/><Street/><Building/></Address></LegalEntity>  на  </Name><LegalEntity>
avatar
11 Санек • 16:03, 15.01.2020
Доброго дня! Микола, підкажіть, будь ласка, як правильно на скрипт встановити іконку? Які саме розміри малюночка брати і як можна збільшити чи зменшити кнопку скрипта? Дякую Вам!
avatar
0
13 Микола • 12:50, 16.01.2020
Добрий день!
Розмір іконки залежить від розміру кнопки. За замовчуванням в Digitals розмірки кнопок скриптів 26х26 пікселів. В мене вони збільшені до 30х30. Змінити розмір кнопок скриптів для панелей, які створюються можна в меню Сервіс-Налаштування-Головна-Константи. Це константа ToolbarSize=26.
Для створення іконок я використовую сайт http://www.xiconeditor.com/. Розмір 24х24. Але малюю в розмірах 22х22. Тоді ідеальне співпадіння при розмірі кнопки 30х30.

Щоб змінити розмір вже існуючої кнопки, яка у форматі tlb, треба відкрити цей файл в блокноті:
ShowHeader=0
Left=14
Top=82
Width=48
Height=528

Visible=0
Anchor=1
avatar
8 sergey_geo • 18:21, 24.12.2019
Добрий вечір. Підкажіть будь-ласка викидає помилку відсутні файли в папці *$Ext! Хочу змінити цільове призначення
avatar
0
9 Микола • 18:28, 24.12.2019
добрий вечір! може ви при копіюванні упустили перший рядок скрипту:
$Ext=.xml
avatar
10 Анонімно • 19:02, 24.12.2019
Точно пропустив! Ок Дякую.
avatar
6 michyrina-9 • 15:39, 05.12.2019
Доброго дня, скористалась Вашим скриптом для заміни цільового призначення земельної ділянки з ,<Purpose>Для ведення товарного сільськогосподарського виробництва </Purpose> на <Purpose>01.01</Purpose>, але програма видає помилку скрипта Unknown command: PROGRESS.START Line 16:@Progress.Start SC Роблю...(всього SC файлів).
Підкажіть в чому моя помилка.
Дякую
avatar
0
7 Микола • 16:01, 05.12.2019
Доброго дня. Оновіть програму Digitals
avatar
3 olkis83 • 18:44, 23.11.2019
Добрий день, ви пишете
</ProprietorCode>

замінити на:

22</ProprietorCode>
Але в мене не замінює а просто додає до того що було.
Мені треба кадастрові номери ділянок (0028, 0029, 0030 і т.д.) замінити на нулі.
я пишу </ParcelID> замінити на 0000</ParcelID>, і виходить така цифра наприклад 00280000
Підкажіть будьласка як з цим боротися?
avatar
0
4 Микола • 22:30, 23.11.2019
Даний скрипт заповнив би нулями кадастровий номер ділянки, якби він був взагалі пустим. Тоді можна було для пошуку писати  </ParcelID>. Але у вас там уже є значення і вони при цьому в кожному обміннику різні. Тому даний скрипт тут не підійде. Бо для пошуку треба писати по кожному обміннику різне значення, наприклад, 0028</ParcelID>. 0028, якщо його не замінити, нікуди ж не дінеться.
Відповідь: Вам підійде щось типу цього
Код
$Ext=.xml
$Re=0000
$InF=@Dialog.SelectFolder Вкажіть папку з файлами
@If $InF= @Break
@Text.FolderList *$Ext $InF
$C=@Text.Count
@If $C=0 @Break В папці "$InF" відсутні файли $Ext
$OutF=$InF\Оброблені файли
@CreateFolder $OutF
@CleanFolder $OutF
$I=0
%Start
$I=$I+1
@If $I>$C then @Break Заповнено $I файлів
$InF=@Text.Line[$I]
@FileOpen $InF
@Map.DeselectAll
@Map.SelectLayer id70005
@Map.Selected.ChangeParameter ID7000513 $Re
$InF=@Map.ClearShortFilename
@Map.SaveToFile $OutF\$InF$Ext
@CloseMap
@Goto %Start
avatar
5 olkis83 • 18:31, 24.11.2019
Дуже дякую за допомогу! smile
avatar
1 nazarpopadyuk1988 • 13:54, 25.04.2019
Доброго дня. Земельний попросив замінити цільове використання у файлах. І кинув він немало небагато - 2000 файлів. Підскажіть будь ласка як замінити із : ідивідуального житлового, гаражного і дачного будівництва в - 02.01 Для будівництва і обслуговування житлового будинку, господарських будівель і споруд (присадибна ділянка). Дякую
avatar
0
2 Микола • 21:56, 25.04.2019
Доброго вечора!
Код
$Tab=@Calc char(9)
$Tab=@DequoteText $Tab
$Papka=@ProgramFolder
@SelectTab 3
$P=0
$WorkPapka=@Dialog.SelectFolder Відкрийте папку з файлами XML
@if $WorkPapka= then @break
@Text[1].FolderListTree *.xml $WorkPapka
$StartText=Початок
$I=0
@Text[2].Clear
%Start
$T1=@Text[1].Text
$FC=@Text[1].Count
@If $FC=0 then @Break В папці не знайдено жодного файла
@Progress.Start $FC Обробляю файли (всього $FC)
@Progress.StepBy $I
%Loop
@Progress.StepBy 1
$Prog=@Progress.Canceled
@if $Prog=1 then @Goto %Break
$I=$I+1
$FN=@Text[1].Line[$I]
$Ver=@Version
@if $Ver<42766 then @Goto %NoPerevValid
$R=@XML.Valid $FN
@if $R=0 then @Goto %Next
%NoPerevValid
$Open=@FileOpen $FN
@if $Open=0 then @Goto %Next
@Map.DeselectAll
@Map.SelectLayer id70005
$SO=@Map.SelectedObject
@if $SO=0 then @Goto %Next
$SCV=@Map.Object[$SO].Parameter[id7000510]
@if "$SCV"="ідивідуального житлового, гаражного і дачного будівництва" then @Map.Object[$SO].Parameter[id7000510]=02.01
@Map.SaveToFile $FN
%Next
@CloseMap $FN
@if $I<$FC then @Goto %Loop
@Progress.Stop
@Dialog.Message Опрацьовано $I файлів
Відповідь: У рядку:
@if "$SCV"="ідивідуального житлового, гаражного і дачного будівництва" then @Map.Object[$SO].Parameter[id7000510]=02.01
вкажіть точне старе значення, яке потрібно замінити на нове - 02.01
avatar