Выбор из файла
select_one_from_file и select_multiple_from_file динамически загружают варианты из внешнего CSV или XML файла, прикреплённого к форме.
select_one_from_file и select_multiple_from_file работают как select_one и select_multiple, но вместо определения вариантов в листе choices варианты загружаются из внешнего CSV или XML файла, прикреплённого к форме. Это полезно, когда список вариантов очень длинный, часто меняется или требует обновления без пересборки всей формы.
Базовая спецификация XLSForm
| type | name | label |
|---|---|---|
| select_one_from_file health_facilities.csv | facility | Выберите медицинское учреждение |
| select_multiple_from_file crops.csv | crops | Какие культуры выращивает домохозяйство? |
Имя файла после имени типа должно совпадать с именем прикреплённого файла при загрузке формы.
Формат CSV-файла
CSV-файл должен иметь не менее двух столбцов: name (хранимое значение) и label (отображаемый текст). Можно добавлять любое количество дополнительных столбцов для фильтрации.
health_facilities.csv:
name,label,district,type
HF001,Nairobi Central Clinic,Nairobi,clinic
HF002,Westlands Health Centre,Nairobi,health_centre
HF003,Kisumu District Hospital,Kisumu,hospital
Фильтрация вариантов
Используйте столбец choice_filter для отображения только вариантов, соответствующих текущему контексту. Ссылайтесь на столбцы CSV по их именам напрямую (без ${}):
| type | name | label | choice_filter |
|---|---|---|---|
| select_one districts.csv | district | Выберите район | |
| select_one_from_file health_facilities.csv | facility | Выберите учреждение | district = ${district} |
В этом примере отображаются только учреждения в выбранном районе. district в choice_filter ссылается на столбец district в CSV-файле; ${district} ссылается на поле формы с именем district.
Применение
Вопросы с выбором из файла обычно используются для:
- Длинных списков вариантов — медицинские учреждения, школы, сёла, списки видов (сотни или тысячи элементов)
- Часто обновляемых списков — когда основной список меняется между раундами опроса, обновляйте только CSV без пересборки формы
- Общих справочных данных — один CSV-файл используется в нескольких формах
- Фильтрованных каскадных выборов — загрузите все регионы/районы/сёла в одном файле, затем фильтруйте по родительскому выбору
Прикрепление файла
При загрузке формы в rtSurvey прикрепите CSV-файл как медиавложение. Имя файла в определении формы должно точно совпадать с именем файла вложения.
Имена файлов чувствительны к регистру. Health_Facilities.csv и health_facilities.csv рассматриваются как разные файлы.
Использование choice-label() с from-file
Для отображения метки выбранного варианта в поле note или calculate:
| type | name | label | calculation |
|---|---|---|---|
| select_one_from_file health_facilities.csv | facility | Выберите учреждение | |
| calculate | facility_label | choice-label(${facility}, ${facility}) | |
| note | summary | Выбранное учреждение: ${facility_label} |
Лучшие практики
- Держите CSV-файлы до 5000 строк для хорошей производительности на мобильных устройствах.
- Всегда включайте столбцы
nameиlabel— дополнительные столбцы необязательны. - Для каскадных выборов используйте один CSV с родительским столбцом и фильтрацию через
choice_filter. - Версионируйте имена CSV-файлов (например,
facilities_v3.csv) при внесении изменений в структуру столбцов. - Тщательно тестируйте выражения фильтрации — опечатка в
choice_filterмолча покажет пустой список вариантов.
Ограничения
- Очень большие CSV-файлы (10 000+ строк) могут замедлять загрузку формы, особенно на устройствах низкого класса.
- CSV-файлы должны загружаться вместе с формой — их нельзя получить по URL во время выполнения (используйте
search()илиpulldata()для динамических поисков). select_multiple_from_fileменее широко поддерживается среди клиентов — перед использованием проверьте совместимость.
Сравнение с search()
select_one_from_file | Внешний вид search() | |
|---|---|---|
| Источник вариантов | Прикреплённый CSV/XML файл | Серверный запрос к базе данных |
| Работает офлайн | Да (файл включён в пакет) | Требует подключения |
| Количество вариантов | Ограничено памятью устройства | Неограниченно (с пагинацией) |
| Данные в реальном времени | Нет | Да |
Для больших, часто меняющихся или серверных наборов данных см. Динамический поиск.