Оператор IMPORT
Оператор IMPORT - создание действия, импортирующего данные из заданного файла в заданные свойства (параметры) или, в общем случае, в заданную форму.
Синтаксис
IMPORT [importFormat] FROM fileExpr importDestination [DO actionOperator [ELSE elseActionOperator]]
IMPORT formName [importFormat] [FROM (fileExpr | (groupId1 = fileExpr1 [, ..., groupIdM = fileExprM])]
importFormat может задаваться одним из следующих вариантов:
JSON [CHARSET charsetStr]
XML [ATTR] [CHARSET charsetStr]
CSV [separator] [HEADER | NOHEADER] [ESCAPE | NOESCAPE] [CHARSET charsetStr]
XLS [HEADER | NOHEADER] [SHEET (sheetExpr | ALL)]
DBF [CHARSET charsetStr]
TABLE
importDestination может задаваться одним из следующих вариантов:
TO [(objClassId1, objClassId2, ..., objClassIdK)] propertyId1 [= columnId1], ..., propertyIdN [= columnIdN] [WHERE whereId]
FIELDS [(objClassId1 objAlias1, objClassId2 objAlias1, ..., objClassIdK objAliasK)] propClassId1 [propAlias1 =] columnId1 [NULL], ..., propClassIdN [propAliasN =] columnIdN [NULL]
Описание
Оператор IMPORT создает действие, которое импортирует данные из файла в значения заданных свойств или в заданную форму.
Если формат импортируемого файла не задан, то он автоматически определяется, в зависимости от класса импортируемого файла (или от расширения, если этот класс равен FILE), следующим образом:
| Формат | Расширение | Класс |
|---|---|---|
| JSON | json | JSONFILE |
| XML | xml | XMLFILE |
| CSV | csv | CSVFILE |
| XLS | xls или xlsx | EXCELFILE |
| DBF | dbf | DBFFILE |
| TABLE | table | TABLEFILE |
Для автоматического определения плоского формата файла по его расширению используется первый переданный файл
Параметры
Источник импорта
-
fileExprВыражение, значением которого является импортируемый файл. Значение выражения должно быть объектом файлового класса (
FILE,RAWFILE,JSONFILEи т. д.). Если при импорте формы это выражение не указано, то по умолчанию используется выражениеSystem.importFile(). -
groupId1, ..., groupIdMИмена групп объектов импортируемой формы, для которых необходимо импортировать данные. Простые идентификаторы. Используется только для импорта формы из плоских форматов.
-
fileExpr1 , ..., fileExprMВыражения, значения которых являются файлами, которые необходимо импортировать для заданных групп объектов. Значения выражений должны быть объектами файлового класса (
FILE,RAWFILE,JSONFILEи т. д.). Используется только для импорта формы из плоских форматов. Для пустой группы объектов используется имяroot.
Формат импорта
-
ATTRКлючевое слово, указывающее на чтение значений из атрибутов элемента. Если не указывается, то чтение производится из дочерних элементов. Применяется только для импорта XML.
-
separatorРазделитель в CSV файле. Строковый литерал. Если не указывается, то по умолчанию берётся разделитель
;. -
HEADER|NOHEADERКлючевые слова, указывающие на присутствие (
HEADER) или отсутствие (NOHEADER) в CSV / XLS файле строки заголовка, в которой содержатся имена колонок. По умолчанию используетсяNOHEADER.При использовании опции
NOHEADER:- именами колонок считаются :
A,B, ...,Z,AA, ...,AE, ... - если колонка не найдена / не соответствует типу свойства назначения, значением этой колонки считается значение
NULL(в остальных форматах импорта в этих случаях платформа выдает ошибку).
- именами колонок считаются :
-
ESCAPE|NOESCAPEКлючевое слово, указывающее на присутствие (
ESCAPE) или отсутствие (NOESCAPE) в CSV файле экранирования спецсимволов (\r,\n,"(двойные кавычки)) и указанного разделителяseparator.NOESCAPEимеет смысл использовать, только в случаях, когда в данных гарантировано не будет заданного разделителя. По умолчанию используетсяESCAPE. -
SHEET (sheetExpr | ALL)Опция, указывающая на импорт конкретного листа Excel файла. Если опция не указана, то берется лист номер один.
-
sheetExprВыражение, значение которого определяет номер импортируемого листа Excel файла. Значение выражения должно иметь класс
INTEGERилиLONG. Нумерация начинается с единицы. -
ALLКлючевое слово, которое означает, что импорт будет производится из всех листов excel файла.
-
-
CHARSET charsetStrОпция, указывающая кодировку файла, используемую при импорте.
-
charsetStrCтроковый литерал, определяющий кодировку. По умолчанию для
JSON,CSVиспользуетсяUTF-8, дляDBF-CP1251. ДляXMLпо умолчанию используется кодировка, указанная в заголовке. При её отсутствии -UTF-8.
-
-
actionOperatorКонтекстно-зависимый оператор-действие, описывающий действие, которое выполняется для каждой импортированной записи.
-
elseActionOperatorКонтекстно-зависимый оператор-действие, описывающий действие, которое выполняется, если ни одной записи импортировано не было. В качестве параметров нельзя использовать параметры, в которые импортируются данные.
Назначение импорта
-
formNameИмя формы, в которую необходимо импортировать данные. Составной идентификатор.
-
objClassId1, ..., objClassIdKКлассы импортируемых объектов. Задаются идентификаторами класса.
K <= 1. По умолчанию считается, что импортируется один объект классаINTEGER. -
objAlias1, ..., objAliasKИмена локальных параметров, в которые записываются импортируемые объекты. Простые идентификаторы.
K <= 1. По умолчанию считается, что импортируется один объект с именемrow. -
propertyId1, ..., propertyIdNСписок идентификаторов свойств, в которые импортируются колонки (поля) данных. Параметры свойств и их классы должны соответствовать импортируемым объектам и их классам.
-
columnId1, ..., columnIdNСписок идентификаторов колонок в исходном файле, из которых будут переноситься данные в соответствующее свойство. Каждый элемент списка задается либо простым идентификатором, либо строковым литералом. При указании идентификатора несуществующей колонки или при отсутствии идентификатора, за колонку, соответствующую свойству, принимается колонка, следующая по порядку за указанной для предыдущего свойства в списке, либо первая, если указывается первое свойство. Для файлов DBF идентификаторы колонок являются регистронезависимыми.
-
whereIdИдентификатор свойства, в которое будет записано значение по умолчанию класса значения этого свойства для каждого импортируемого объекта. Параметры свойства и его классы должны соответствовать импортируемым объектам и их классам. Если это свойство не задано и количество импортируемых объектов больше нуля, по умолчанию осуществляется поиск свойства с именем
importedи классами импортируемых объектов (напримерSystem.imported[INTEGER]). -
propClassId1, ..., *propClassId*NСписок имен встроенных классов импортируемых колонок.
-
propAlias1, ..., propAliasNИмена локальных параметров, в которые импортируются колонки (поля) данных. Простые идентификаторы. Если имя не задается, то в качестве имени параметра будет использовано имя колонки (поля) в исходном файле.
-
NULLКлючевое слово. Обозначает, что
NULLзначения при импорте (если импортируемый формат их поддерживает) не будут заменяться на значения по умолчанию (например,0- для чисел, пустые строки - для строк и т. п.).
Примеры
import() {
LOCAL xlsFile = EXCELFILE ();
LOCAL field1 = BPSTRING[50] (INTEGER);
LOCAL field2 = BPSTRING[50] (INTEGER);
LOCAL field3 = BPSTRING[50] (INTEGER);
LOCAL field4 = BPSTRING[50] (INTEGER);
LOCAL headField1 = BPSTRING[50] ();
LOCAL headField2 = BPSTRING[50] ();
INPUT f = EXCELFILE DO {
IMPORT XLS SHEET 2 FROM f TO field1 = C, field2, field3 = F, field4 = A;
IMPORT XLS SHEET ALL FROM f TO field1 = C, field2, field3 = F, field4 = A;
// свойство imported - системное свойство, предназначенное для перебора данных
FOR imported(INTEGER i) DO {
MESSAGE 'field1 value = ' + field1(i);
MESSAGE 'field2 value = ' + field2(i);
MESSAGE 'field3 value = ' + field3(i);
MESSAGE 'field4 value = ' + field4(i);
}
}
LOCAL t = FILE ();
EXTERNAL SQL 'jdbc:postgresql://localhost/test?user=postgres&password=12345'
EXEC 'SELECT x.a,x.b,x.c,x.d FROM orders x WHERE x.id = $1;'
PARAMS '4553'
TO t;
// импорт с опцией FIELDS
IMPORT FROM t() FIELDS INTEGER a, DATE b, BPSTRING[50] c, BPSTRING[50] d DO
NEW o = Order {
number(o) <- a;
date(o) <- b;
customer(o) <- c;
// находим currency с данным именем
currency(o) <- GROUP MAX Currency currency IF name(currency) = d;
}
INPUT f = FILE DO
IMPORT CSV '*' HEADER CHARSET 'utf-8' FROM f TO field1 = C, field2, field3 = F, field4 = A;
INPUT f = FILE DO
IMPORT XML ATTR FROM f TO field1, field2;
INPUT f = FILE DO
IMPORT XML ROOT 'element' ATTR FROM f TO field1, field2;
INPUT f = FILE DO
IMPORT XML ATTR FROM f TO() headField1, headField2;
INPUT f = FILE DO
INPUT memo = FILE DO
IMPORT DBF MEMO memo FROM f TO field1 = 'DBFField1', field2 = 'DBFField2';
}
date = DATA DATE (INTEGER);
sku = DATA BPSTRING[50] (INTEGER);
price = DATA NUMERIC[14,2] (INTEGER);
order = DATA INTEGER (INTEGER);
FORM import
OBJECTS o = INTEGER // заказы
OBJECTS od = INTEGER // строки заказов
PROPERTIES (o) dateOrder = date // импортируем дату из поля dateOrder
PROPERTIES (od) sku = sku, price = price // импортируем товар количество из полей sku и price
FILTERS order(od) = o // в order - записываем верхний заказ
;
importForm() {
INPUT f = FILE DO {
IMPORT import JSON FROM f;
SHOW import; // показываем что импортировалось
// создаем объекты в базе
FOR DATE date = date(INTEGER io) NEW o = Order DO {
date(o) <- date;
FOR order(INTEGER iod) = io NEW od = OrderDetail DO {
price(od) <- price(iod);
sku(od) <- GROUP MAX Sku sku IF name(sku) = sku(iod); // находим sku с данным именем
}
}
}
}