Головна » 2015 » Травень » 26 » Функції скриптів - Робота з текстом
19:37
Функції скриптів - Робота з текстом

Всі скриптові функції Digitals для зручності можна поділити на категорії, в залежності від того, які операції та над якими об'єктами виконує та чи інша функція. 


Текстові списки

  Текстові списки @Text[N]​ - це функції для роботи із різноманітними списками. В них можна заносити список файлів, список шарів карти, список виділених об'єктів карти тощо чи будь-який інший текст 

Особливістю текстового списку  @Text[N]​  є те, що він, без допомоги перемінних, може зберігати в собі текстове значення

Заносити значення в  текстові списки можна через перемінні (@Text.Text $A), читаючи з текстових файлів (@Text.Load Filename) і, навіть, через буфер обміну(@Text.Paste) 

  В текстові списки можна додавати чи видаляти з них окремі рядки, посилатися на потрібні рядки, шукати їх по змісту тощо. 

  В межах одного скрипту можна використовувати до 63 різних списків, які адресуються як Text[1],Text[2] … Text[63]. Якщо в скрипті використовується тільки один текстовий список, то його можна адресувати як Text без вказування індексу.

 

@Text[N].Text - читає та записує текст текстового списку 

@Text.Text Білий Іван Степанович
$mes=@Text.Text
@Dialog.Message $mes

@Text[N].Save Filename – записує список у текстовий файл

$TypDoc=Паспорт громадянина України
@Text.Text $TypDoc
@Text.Save D:\Dovidnyk.txt

@Text[N].Load Filename – завантажує список із текстового файлу

@Text.Load D:\Dovidnyk.txt
$mes=@Text.Text
@Dialog.Message $mes


@Text[N].Add Value – добавляє текстовий рядок у кінець списку

$TypDoc=Паспорт громадянина України
@Text.Text $TypDoc
$KymVydDoc=Дрогобицьким РВ УМВС України у Львівській області
@Text.Add $KymVydDoc
$Mes=@Text.Text
@Dialog.Message $Mes
@Text.Save D:\123.txt

Text[N].Line[N] - посилається на певний рядок у списку

@Text.Load D:\Dovidnyk.txt
$KymVydDoc=Text.Line[2]
@Dialog.Message $KymVydDoc

@Text[N].Clear – очищає список, кількість рядків стає дорівнювати 0
@Text[N].Count – визначає кількість рядків у тексті

@Text[N].FolderList Mask FolderName - заповнює список повними іменами файлів із вказаної папки

@Text[N].FolderListTree Mask FolderName - заповнює список повними іменами файлів із вказаної папки і всіх її підпапок

@Text[1].FolderListTree *.xml D:\WORK
$FC=@Text[1].Count
$I=0
%Loop

$I=$I+1
$FN=@Text[1].Line[
$I]
@FileOpen
$FN
@if $I<$FC then @Goto %Loop

@Text[N].Copy - копіює текст в буфер обміну

@Text[N].Paste - вставляє текст з буфера обміну
 

@Text[N].IndexOf FindStr - шукає заданий текст і виводить номер рядка, в якому він знаходиться або 0 (при його відсутності)

@Text[N].Delete N1-N2 - видаляє рядки із номерами від N1 до N2

@Text[N].NumericSort [+/-] - сортує список числових значень списку по зростанню чи по зменшенню

@Text[N].KeyValue FindStr - читає значення за ключом такого вигляду: ключ<tab>значення

@Map.Object[N].TableText [NewText] - читає чи записує вміст таблиці

Читайте також Використання текстових списків (@Text) для редагування таблиць
 

Функції @Calc

@Calc Length("s") – визначає довжину рядка.

$H=геодезія
$L=@Calc Length("$H")
@Dialog.Message $L
;в результаті отримаємо 9 (кількість букв у слові "геодезія")


@Calc Pos("t","s") – визначає позицію частини рядка t в рядку s.

$H=геодезія
$A=о
$L=@Calc Pos("$A","$H")
@Dialog.Message $L
;в результаті отримаємо 3 (номер за порядком букви "о" у слові)


@Calc Trim("s") – видаляє пробіли на початку і в кінці символьного рядка
@Calc TrimLeft("s") – видаляє пробіли на початку символьного рядка
@Calc TrimRight("s") – видаляє пробіли в кінці символьного рядка
@Calc Upper("s") – переводить усі символи у верхній регістр

$H=Геодезія
$L=@Calc Upper("$H")
@Dialog.Message $L
;в результаті отримаємо "ГЕОДЕЗІЯ"


@Calc Lower("s") – переводить усі символи у нижній регістр
@Calc Copy("s","x",["y"]) – копіює частину рядка (число символів y, починаючи з символа x).

$H=4621283300
$L=@Calc Copy("$H","1","8")
@Dialog.Message $L
;в результаті отримаємо "46212833" (8 символів, починаючи з 1-го)


@Calc Delete("s","x",["y"]) – видаляє частину рядка (число символів y, починаючи з символа x).
@Calc Insert("s","t","x") – вставляє частину символьного рядка t в рядок s в позицію x.

$H=4621200
$P=833
$L=@Calc Insert("$H","$P","6")
@Dialog.Message $L
;в результаті отримаємо "4621283300"


@Calc Replace("s","t","v",[1/0=ReplaceAll,[1/0=IgnoreCase]] ) – в рядку s знаходить частину рядка t і замінює її на значення v.

$H=4621283300
$P=833
$L=@Calc Replace("$H","$P","555")
@Dialog.Message $L
;в результаті отримаємо "4621255500"

;заміна в координатах коми на крапку
$X=@Calc replace("$X",",",".")
$X=@DequoteText $X
$Y=@Calc replace("$Y",",",".")
$Y=@DequoteText $Y

1/0=ReplaceAll означає, що якщо вибрано 1 (@Calc Replace("s","t","v",1,1 ), то будуть замінені всі значення, якщо 0 - то тільки перше

1/0=IgnoreCase означає, що якщо вибрано 1 (@Calc Replace("s","t","v",1,1 ), то замінені будуть всі значення, не залежно від того, ВЕЛИКИМИ літерами вони чи малими, якщо 0 - то тільки у відповідності


@Calc char(s) - повертає символ ASCII, відповідний вказаному числовому коду

;пробіл:
$Space=@Calc char(32)

;знак табуляції:
$Tab=@Calc char(9)

;вертикальний слеш:
$VBar=@Calc Char(124)

@Calc Ascii(s) - протилежна функції @Calc char

@Calc trunc - повертає цілочисельну частину числа з плаваючою комою. Тобто, обрізає дробову частину числа.

;заокруглення числа до двох знаків після коми
$Dn=5447835.727
$Dn=@Calc trunc(100*$Dn+0.5)/100
@Dialog.Message $Dn1

Інші доступні операції Calc:
Math functions:
Abs(x), Frac(x), Trunc(x), Heaviside(x) or H(x), Sign(x), Sqrt(x), Ln(x), Exp(x), Cos(x), CTg(x), Ch(x), CTh(x), Sin(x), Sh(x), Tg(x), Th(x), ArcSin(x), ArcCos(x), ArcTg(x), ArcCtg(x)

@DequoteText - видаляє лапки. Застосовується після функцій @Calc, оскільки їх результатом часто є значення в лапках 

$H=4621283300
$P=833
$L=@Calc Replace("$H","$P","555")
$L=@DequoteText $L
@Dialog.Message $L
;в результаті отримаємо 4621255500

Конвертація букв та цифр

@ArabicToRoman Number - конвертує арабські цифри в римські

@RomanToArabic Number - конвертує римські цифри в арабські

@IsUpCase Text - повертає 1, якщо перша буква в даному тексті велика

@IsUpperCase Text - повертає 1, якщо всі букви в даному тексті великі

@LowerCase Text - робить всі букви тексту малими

@UpperCase Text - робить всі букви тексту великими

@StringToUTF8 Text - конвертує текстовий рядок ANSI в кодування UTF-8

@UTF8ToString Text - конвертує текстовий рядок з кодування UTF-8 в ANSI

@RoundTo Number Precision - округляє задане число до заданої точності (вказаного числа знаків після коми)

@ReplaceChar OldCharNewCharString - робить заміну символу OldChar на NewChar у символьному рядку чи перемінній String. Всі три параметри подаються вкупі, без пробілів.

@Map.ReplaceTableVariables - сканує текст таблиць і замінює змінні їх значеннями

Об'єднання та роз'єднання

@Concat Str - об'єднує частини строки, які розділені комами в одну строку

@Concat 1,2,3,4,5,6,7,8,9,0

@StringPart Number String - витягує частину рядка, наприклад, String Part 2 Іван Шевченко -> Шевченко, а StringPart 1, Ділянка паювання, 7 -> Ділянка

;витягуємо з рядка тільки назву нас.пункту, вулицю та будинок
$Text=804,82457,Львівська,Дрогобицький,с.Добрівляни,вул.Шкільна,130,-,25
$P1=@StringPart 5,$Text
$P2=@StringPart 6,$Text
$P3=@StringPart 7,$Text
$Res=$P1,$P2,$P3
@Dialog.Message $Res

;об'єднуємо значення кадастрового номера в рядок без двокрапок
$KN=4621283300:01:001:0001
$KN1=@StringPart 1:$KN
$KN2=@StringPart 2:$KN
$KN3=@StringPart 3:$KN
$KN4=@StringPart 4:$KN
$KN="$KN1$KN2$KN3$KN4"
$KN=@DequoteText $KN
@Dialog.Message $KN

@StringPartCount Char String - повертає число частин рядка, розділених символом

;рахуємо, скільки частин між комами в даному рядку
$Text=804,82457,Львівська,Дрогобицький,с.Добрівляни,вул.Шкільна,130,-,25
$PartCount=@StringPartCount , $Text
@Dialog.Message 
$PartCount

Інші функції

@Assign - присвоює змінній значення текстового рядка без спроби вирахувати вирази

@Map.CreateExplication - створює експлікацію угідь

@Map.PrepareForestTable ObjNumber - готує текст таблиці промірів лісного виділу

@Random [Range] - повертає випадкове число від 0 до Range. Якщо Range не задано - то випадково повертає 0 або 1

@ToDate DateString - повертає числове значення дати по її символьному увленні, або поточну дату

@Map.FromPLG - зберігає інформацію про пікети в польський текстовий формат (PLG, що схожий на DAT-файл)

Приклади

 

Приклад 1 - заміна римської цифри на арабську

@Map.DeselectAll
@Map.SelectLayer ID20000
$PZ=@Map.Selected.GetParameter PZ
$New=@Calc Replace("$PZ","XXII","22",1,0)
$New=@DequoteText $New

Приклад 2 - Витягуємо код і назву угіддя

перед запуском скрипту потрібно виділити XML Угіддя


;записуємо в перемінну номер виділеного об'єкта
$I=@Map.SelectedObject
;записуємо в перемінну значення параметра "Код угіддя" нашого об'єкта
$Land=@Map.Object[$I].Parameter[ID7000901]
;витягуємо із перемінної власне код (6 цифр, починаючи з першої)
$LandCode=@Calc Copy("$Land",1,6)
;видаляємо лапки
$LandCode=@DequoteText $LandCode
;витягуємо із перемінної назву угіддя без коду (1000 символів, починаючи із 8-го)
$LandName=@Calc Copy("$Land",8,1000)
;видаляємо лапки
$LandName=@DequoteText $LandName
;виводимо повідомлення з результатом
@Dialog.Message Код угіддя - $LandCode, назва угіддя - $LandName

Приклад 3 - Скрипт, який миттєво знаходить потрібний файл XML в базі з десятки тисяч обмінників

Спершу складаємо список всіх обмінників з потрібної папки, записуючи в текстовий файл D:\Baza.txt

;створюємо діалог вибору папки з обмінниками
$WorkPapka=@Dialog.SelectFolder Виберіть папку з файлами для опрацювання
;якщо папка відсутня, зупиняємо процедуру
@if $WorkPapka= then @break
;заповнюємо список повними іменами файлів із вказаної папки
@Text.FolderListTree *.xml $WorkPapka
;визначаємо, скільки в списку обмінників (рядків)
$FC=@Text[1].Count
;зберігаємо список у файл
@Text.Save D:\Baza.txt
;виводимо вікно з повідомленням про результат
@Break Оброблено $FC обмінників


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

;відкриваємо наш список файлів
@Text[1].Load D:\Baza.txt
;дістаємо загальну кількість рядків
$FC=@Text[1].Count
;присвоюємо перемінній, від якої будемо рахувати значення "0"
$I=0
;починаємо цикл по усіх рядках списку
%Loop
;отримуємо номер рядка (для першого 1=0+1, для другого 2=1+1 і т.д.)
$I=$I+1
;записуємо в перемінну значення знайденого рядка
$FN=@Text[1].Line[$I]
;Видобуваємо ім'я файла із повно імені (C:\Images\IMG_01.jpg -> IMG_01.jpg)
$FNShort=@ExtractFileName $FN
;добавляємо результат як рядок в другий текстовий список
@Text[2].Add $FNShort
;повертаємося на початок циклу, якщо номер рядка менший за загальну кількість рядків
@if $I<$FC then @Goto %Loop
;зберігаємо результат у текстовий файл
@Text[2].Save D:\BazaShort.txt
;запускається вікно з результатом про виконання
@Dialog.Message Виконано!


І створюємо кнопку, власне, для швидкого пошуку обмінників в базі і їх відкриття. 
 

;відкриваємо список повних імен (шлях+назва файлу)
@Text[2].Load D:\Baza.txt
;відкриваємо скорочений список
@Text[1].Load D:\BazaShort.txt
;виводимо вікно, де потрібно ввести назву файла, який треба знайти
$KN=@Dialog.Ask Кадастровый номер для пошуку в базі Default=4621283300020010000
;шукаємо назву файла у скороченому списку і заносимо в перемінну номер знайденого рядка
$SeartIndex=@Text[1].IndexOf $KN.xml
;якщо такий рядок не знайдено, виводимо повідомлення
@if $SeartIndex=0 then @Dialog.Message Такого файла in4 в базі нема
;якщо такий рядок не знайдено, переходимо до позначки %Next
@if $SeartIndex=0 then @Goto %Next
;записуємо в перемінну вміст рядка під знайденим номером, але з повного списку файлів
$Seart=@Text[2].Line[$SeartIndex]
;відкриваємо знайдений файл
@FileOpen $Seart
%Next


Тобто, першими двома кнопками ми створюємо та індексуємо базу. А для пошуку користуємося тільки третьою кнопкою.

Приклад 4 - Скрипт, який додає на карту всі файли DMF із вказаної папки

У рядку @SendChars 123<CR> замість 123 потрібно вказати пароль карт, якщо карти мають паролі.

 

$WorkPapka=@Dialog.SelectFolder Виберіть папку з файлами для опрацювання і почекайте на результат (це може зайняти деякий час)
@if $WorkPapka= then @break
@Text[1].FolderListTree *.dmf $WorkPapka
$T1=@Text[1].Text
$FC=@Text[1].Count
@If $FC=0 then @Break В папці не знайдено жодного файла
$I=0
@Map.BeginUpdate
@Progress.Start $FC Додаю файли
%Loop
@SendChars 123<CR>
$Prog=@Progress.StepBy
@if $Prog=0 then @Break
$I=$I+1
$FN=@Text[1].Line[$I]
@Map.InsertFromFile $FN
@if $I<$FC then @Goto %Loop
@Progress.Stop
@Map.EndUpdate


Примітка: жирним шрифтом (напр.@ActivateMap) виділена назва функції, похилим шрифтом (напр.Number) перемінна функції, у квадратних скобках (напр.[MapNumber]) необов'язкова перемінна, яку можна не вказувати.

Переглядів: 5156 | Додав: Микола | Рейтинг: 5.0/2
Всього коментарів: 19
avatar
16 mrskorobagatyj • 16:43, 23.11.2021 [Матеріал]
Додайте будь ласко нові функції та приклади до них.
avatar
0
17 Микола • 18:55, 23.11.2021 [Матеріал]
Ці численні нові функції для обробки тексту є досить специфічними і я особисто не знайшов в них якоїсь реальної користі. Бо практично кожну з цих функцій можна замінити іншими через цикли. Тому я їх проігнорував, бо не маю достатньо часу, щоб інвентаризувати зараз усі нові функції скриптів. Колись пізніше це зроблю. Але про них можете знайти на форумі Геосистема. Я запитував про них в Діми Золотаря. Він розписав був, яка функція для чого призначена. Дивіться ТУТ
avatar
18 mrskorobagatyj • 22:35, 23.11.2021 [Матеріал]
@Text[N].Leading Char, цю функію можно використати для площі, наприклад якщо площа=0,2310 чи 2,0000
avatar
0
19 Микола • 00:33, 24.11.2021 [Матеріал]
для цього є функція @RoundTo Number Precision - округляє задане число до заданої точності (вказаного числа знаків після коми)
avatar
13 mrsiromanets • 18:46, 22.11.2021 [Матеріал]
Як знову підписатись на розсилку на емейл? а то я випадково понакляцував
avatar
0
14 Микола • 20:29, 22.11.2021 [Матеріал]
Внизу у формі коментарів є кнопка

Щоб кнопка стала активною, оновіть сторінку після того, як відписалися.
avatar
15 Анонімно • 20:41, 22.11.2021 [Матеріал]
Дякую
avatar
11 mrsiromanets • 19:30, 17.11.2021 [Матеріал]
Доброго дня. Підкажіть будь ласка чи є така функція щоб змінити розмір підписів на карті, не окремо одного а відразу всіх (в мене їх 300 штук, по одній довго міняти)
avatar
-1
12 Микола • 15:26, 18.11.2021 [Матеріал]
Добрий день. Якщо усі підписи в одному параметрі - то змініть просто розмір шрифту в цьому параметрі.
avatar
9 Анонімно • 15:51, 19.10.2021 [Матеріал]
Добрый день, подскажите пожалуйста чи возможно все помеченные объекты карты занести в список, после чего обращаться к каждому (по порядку списка)
avatar
1
10 Микола • 20:38, 19.10.2021 [Матеріал]
Прономеруйте усі об'єкти в якомусь з параметрів на закладці Інфо, а потім через Правка - Знайти отримаєте виділення потрібного. Це буде зручніше. Скриптом в даному випадку не буде дуже практично. Особливо, коли в карту будуть вноситися зміни. В скрипті для кнопки можна просто прописати команду для швидкого виклику або вікна для пошуку, або команди Вибрати | Шари...
avatar
7 SerjN • 02:02, 12.02.2021 [Матеріал]
Доброго дня.
При створенні скриптів стикаюсь з такою проблемою - не працює порівняння строкових змінних у функції @if. Наприклад: @if $K= then ... або  @if $K<> then ... або
@if $K=$N then ... та тому подібне.
Останній приклад - хотів по кадастровому номеру шукати додаткову інформацію у текстовому файлі (де він стоїть першим в строчці) і вставляти її в документ, але із-за того що порівняння не спрацювало - нічого не вийшло.

$KadNomer=@Map.Object[$NO].CalculateFormula Parent...........
$Spisok=@Text.Load Lists\111.txt
$KS=@Text.Count
$i=0
%Start
$i=$i+1
@if $i>$KS @Goto %Fin
$Stroka=@Text.Line[$i]
$KND=@StringPart 1$Tab$Stroka
@Dialog.Message ---$KND---$KadNomer---
@if $KND<>$KadNomer then @Goto %Start
$F=@StringPart 6$Tab$Stroka
$B=@StringPart 7$Tab$Stroka
$BS=@StringPart 8$Tab$Strok
%Fin

Пробував і такий варіант циклу:
@if $KND=$KadNomer then @Goto %Fin1
@Goto %Start
%Fin1
$F=@StringPart 6$Tab$Stroka
$B=@StringPart 7$Tab$Stroka
$BS=@StringPart 8$Tab$Strok
%Fin
отримав теж саме - кадастрові номери не порівнюються і скрипт іде далі на нижню строку
Ввів діалог для виявлення зайвих символів - зайвих не показало
---7125183200:02:000:0291---7125183200:02:000:0291---
Підкажіть у чому тут може бути причина?
avatar
0
8 Микола • 12:30, 12.02.2021 [Матеріал]
Доброго дня!
Беріть в лапки порівняльні елементи:
@if "$KND"<>"$KadNomer" then ...
Інакше скрипт обрізає цифру до перших двокрапок у ній.
avatar
1 mrskorobagatyj • 11:35, 01.06.2020 [Матеріал]
Доброго дня. Підкажіть як витягнути номер рядка з текстового файлу як що в рядку є пробіл або знак табуляції. Наприклад 2312500000|tab|71501. Хочу витягти номер рядка по кадастровому номеру щоб потім с цього рядка через StringPart2 витягти індекс. Так можливо? чи требо іншим шляхом робити?
$Zon=@Map.Layers.ObjectCount ID70003
@If $Zon=0 then @Break
$Zona=@Map.Object[$Zon].CalculateFormula Parent[ID7000301](ID70003)
$Zona=@Calc copy("$Zona",1,10)
$Zona=@DequoteText $Zona
@Text[1].Load C:\Digitals\Lists\Postal_codes\Index.txt
$F=@Text[1].IndexOf $Zona
avatar
0
2 Микола • 19:44, 01.06.2020 [Матеріал]
замість останнього рядка у вас напишіть:
$F=@Text[1].KeyValue $Zona
avatar
3 mrskorobagatyj • 10:09, 02.06.2020 [Матеріал]
Дякую за відповідь саме те що треба.
Підкажіть ще, як що починається з букв наприклад Енергодар|tab|71501, як отримати той же результат що з коатuu
avatar
0
4 Микола • 11:45, 02.06.2020 [Матеріал]
Та так само, просто замість перемінної $Zona вам потрібно перемінну, яка буде містити ваші назви (Енергодар і інші). Тобто, вам замість коду, який витягує з обмінника КОАТУУ треба код, який буде витягувати назву і записувати у цю перемінну.
avatar
5 mrskorobagatyj • 13:46, 02.06.2020 [Матеріал]
Щось ні як не підтягує може щось не так.
@Map.SelectLayer ID70005
$Parcel=@Map.SelectedObject
$Ow=@Map.Object[$Parcel].Parameter[ID7000520]
$Pr=ProprietorInfo/Authentication/NaturalPerson/Address
$SM=@XML.XPath $Pr/Settlement $Ow
$SM=@StringPart 2 $SM
@Text[1].Load C:\Digitals\Lists\Postal_codes\Index.txt
$Res=@Text[1].KeyValue $SM
@Dialog.Message $Res
А з коату все добре
avatar
0
6 Микола • 19:39, 02.06.2020 [Матеріал]
Для чого рядок $SM=@StringPart 2 $SM ?
Ви що назву населеного пункту пишете повними словами: місто, село, седище міського типу?
Назва населеного пункту пишеться скорочено. Тому роздільником є крапка, а не пробіл.
Та найкраще у файлі пистати повністю м.Енергодар|tab|71501
бо інколи після м. є ще пробіли, а інколи нема.
Інколи назва населеного пункту може бути з декількох слів, а вам так витягне тільки перше.
Якщо смт - то також ще один варіант буде - без крапки. А якщо написано повністю - то це три слова аж.
avatar