Разбиение поля на несколько полей

Практические советы по работе с FileMaker, типичные задачи и их решения. У вас вопрос? Пишите сюда.
Ответить
artema
Сообщения: 3
Зарегистрирован: 01 дек 2018, 09:29

Разбиение поля на несколько полей

Сообщение artema » 14 дек 2018, 10:47

Существует некоторый текст, состоящий из хаотичного число пробелов и параграфов. Его необходимо вставить в одно поле, а затем автоматически произвести разбивку на разные поля (в данном случае каждая строка – новое поле)

Исходный текст представлен на скрине:
Необходимо разбить на разные поля.jpg
Необходимо разбить на разные поля.jpg (9.78 КБ) 980 просмотров
Необходимо понимать, что наименование устройства, серийный номер, IMEI и конфигурация каждый раз меняются.
Есть ли какие-нибудь функции по разбивке строк одного поля на несколько? Или есть иной способ решить данную задачу?

Заранее спасибо за помощь!

Аватара пользователя
Arcady
Администратор
Сообщения: 142
Зарегистрирован: 10 сен 2017, 20:45
Контактная информация:

Re: Разбиение поля на несколько полей

Сообщение Arcady » 15 дек 2018, 06:49

Функция GetValue ( listOfValues ; valueNumber ) возращает строку из списка по номеру строки
Если порядок строк всегда одинаковый, то вы можете настроить в полях Auto Enter в каждом из своих полей, который будет по соответствующему номеру забирать нужное значение в поле.
Если же нет, то обрабатывать скриптом разнося значения по полям, опять же забирая их через GetValue с предварительным анализом значения и вставки в нужное поле.
Аркадий Перла.
ТриА. Разработка решений для FileMaker
http://tria.pw

Alexei Sytch
Сообщения: 53
Зарегистрирован: 21 сен 2017, 18:48
Откуда: Минск

Re: Разбиение поля на несколько полей

Сообщение Alexei Sytch » 17 дек 2018, 21:57

Часто текст содержит не одну строчку, а например сразу целую таблицу. Разбиение тогда проводим в два этапа: сначала строки нарезаем в записи базы данных, заем из строк извлекаем нужные или все поля

1. Текст помещаем в глобальное поле ВесьТекст.
2. Создаем в таблице еще одно поле Кусочек
3. Создаем в таблице поля под нужные для извлечения значения (можно с формулой или с автозаполнением или заполнять их по скрипту, мне показалось удобных по скрипту, так как проще отладка при сложном парсинге)
4. В скрипте сначала создаем записи по количеству строк (Loop, exit loop if ), Количество строк определяем по ValueCount( text ).
5. Командой Replace Field Contents разрезаем глобальное поле на кусочки и заполняем ими поле Кусочек, например, с помощью формулы GetValue( ВесьТекст ; Get( RecordNumber ) ).
6. Дальше опять же по Replace Field Contents преобразуем колонки в текста в нужные поля базы данных
7. Для усложнения логики парсинга часто бывает полезна функция GetNthRecord( Поле1; Get( RecordNumber ) - 1 ) - которая в позволяет строить логику If, Case в зависимости от значения в предыдущей записи (или следующей) -- самый популярный кейс - заполнить пропущенные даты аналогичными значениями или внести раздел таблицы в отдельное поле
8. Для совсем сложных случаев можно использовать RegEx custum functions или аналогичные в плагинах

Такой подход можно использовать для парсинга таблиц с сайтов, которые не отдают данные в XML, например прайс-листов, таблиц цен. Кроме этого подход применим для парсинга текста из PDF (при условии что текст из PDF через COPY/PASTE пользователь вставит в глобальное пола)

P.S. ну и конечно импорт текста как CSV тоже часто выручает, особенно, если еще надо что-то с кодировкой поменять

Аватара пользователя
Arcady
Администратор
Сообщения: 142
Зарегистрирован: 10 сен 2017, 20:45
Контактная информация:

Re: Разбиение поля на несколько полей

Сообщение Arcady » 20 дек 2018, 18:38

Если объем текста (будущей таблицы) сравнительно большой, то такой способ (циклы, replace) может сильно тормозить.

Альтернативный вариант, сохраняем текст как CSV файл и импортируем в нашу таблицу. Импорт в ФМ работает гораздо быстрее, чем создавать записи в скрипте в цикле.
Если текст корректно структурирован, то можно импортировать сразу в нужные поля и тогда вообще никаких преобразований не нужно. Если нет, то можно импортировать каждую строку целиком в одной поле (тут надо позаботится чтобы в файле разделители колонок не сломали импорт) и потом (разумнее всего по AutoEnter ) настраиваем каждое поле по GetValue() "выхватывать" свое значение из строки - тут можно добавить какие-то условия и проверки.
Аркадий Перла.
ТриА. Разработка решений для FileMaker
http://tria.pw

Warnermaita
Сообщения: 1
Зарегистрирован: 21 дек 2018, 17:14

Разбиение поля на несколько полей

Сообщение Warnermaita » 12 янв 2019, 14:32

Можно ли на форме ввода в выпадающем списке TgsIBLookupComboBox
выводить несколько полей таблицы? Свойство: ListTable - таблица,
ListField - поле таблицы отображаемое в списке. Можно ли указать
два поля, например номер и дату?

andrey volkov
Сообщения: 184
Зарегистрирован: 11 сен 2017, 13:42
Откуда: Санкт-Петербург

Re: Разбиение поля на несколько полей

Сообщение andrey volkov » 15 янв 2019, 11:57

> Можно ли указать
два поля, например номер и дату?

стандартными средствами - нет
Можно в таблицу добавить еще одно поле, которое вычисляет текст:

Код: Выделить всё

table::date & Char(9) & "  " & table::number
и уже это поле использовать в выпадающем списке.

Ответить