iT邦幫忙

2024 iThome 鐵人賽

DAY 24
0
自我挑戰組

用 ODK 和 Access VBA 打造行動化資料收集流程系列 第 24

Day24: 表單資料集(Form Datasets)

  • 分享至 

  • xImage
  •  

ODK 表單可以透過多種方式使用資料集。這些資料集可以位於表單內部或外部。內部資料集在 XLSForm 的選擇表中定義,通常用作選擇的選項。
您也可以在選擇表中定義資料集,以根據使用者輸入查找值。了解如何在選擇部分定義內部資料集。

外部資料集在以下情況下很有用:

  • 數據來自另一個系統。使用附加到表單的資料檔案通常比將資料新增至表單定義需要更少的步驟。
  • 數據經常變化。可以更新附加到表單的一個或多個資料文件,而無需修改表單定義。
  • 資料在表單之間重複使用。將相同的資料檔案附加到多個表單可能比將資料複製到所有表單定義中更容易。
  • 相同的形式用於不同的上下文。例如,完全相同的表單定義可以在具有列出地區、本地產品等的不同資料檔案的多個國家/地區使用。

以下所述的所有技術都適用於實體清單(Entity Lists)。
實體清單可以被視為由 ODK Central 管理的 CSV,以便可以在同一專案中的其他表單中自動存取透過一個表單提交收集的資料。

從 CSV 檔案建置選擇項目

CSV 檔案可用作使用 select_one_from_file 或 select_multiple_from_file 的選擇小工具的資料集。
以這種方式使用的 CSV 檔案必須具有name和label欄位,除非您使用parameters 欄位來自訂所使用的欄位名稱。
對於資料集中的每一行,值列中的文字(預設為name欄位)將用作選擇該選項時儲存的值,標籤列中的文字(預設為label欄位)將用於顯示該選項。
對於多重選擇項目,name 欄位的內容不得包含空格。
這些文件也可能具有在 choice filters或其他表達式中使用的任意數量的附加列。
下面的範例使用內部選擇中的一項,然後從兩個不同的外部 CSV 檔案中進行選擇。
survey

type name label choice_filter
select_one states state State
select_one_from_file lgas.csv local_gov_area Local Government Area state=${state}
select_multiple_from_file wards.csv wards Wards lga=${local_gov_area}

choices

list_name name label population
states abia Abia 4112230
states ebonyi Ebonyi 2176947

lgas.csv

name label state
aba_n Aba North abia
aba_s Aba South abia
afikpo_n Afikpo North ebonyi

wards.csv

name label lga
eziama Eziama aba_n
umuogor Umuogor aba_n
ezeke_amasiri Ezeke amasiri afikpo_n
poperi_amasiri Poperi amasiri afikpo_n

##從 GeoJSON 檔案中建立選擇項目##

遵循 GeoJSON 規範的 GeoJSON 檔案可用作使用 select_one_from_file 填入選擇問題的資料集。
來自 GeoJSON 的選擇可以使用地圖外觀將樣式設為地圖,但也可以使用任何其他選擇外觀。
為了供表單使用,GeoJSON 檔案:

  • 必須具有 .geojson 副檔名(不是 .json)
  • 必須定義單一頂級FeatureCollection
  • 必須包含每個功能的唯一識別碼(預設情況下使用頂級 id,再者使用id屬性,或可以自行設定:https://docs.getodk.org/form-question-types/#customizing-label-and-value)
  • 必須僅包含Point、LineString 或Polygon 類型的要素

survey

type name label
select_one_from_file museums.geojson museum Select the museum closest to you

表單中引用的 GeoJSON 檔案可以具有任意數量的功能和任意數量的自訂屬性。

{
  "type": "FeatureCollection",
  "features": [
      {
          "type": "Feature",
          "geometry": {
              "type": "Point",
              "coordinates": [
                  7.0801379,
                  46.5841618
              ]
          },
          "properties": {
              "id": "fs87b",
              "title": "HR Giger Museum",
              "annual_visits": 40000
          }
      }
  ]
}

所有屬性均透過從地圖問題中選擇來顯示,並且可以由表單的任何部分引用。
特徵的幾何圖形可以作為幾何圖形進行訪問,並以 ODK 格式提供。
給定上面的 GeoJSON 檔案和表單定義,如果使用者選擇“HR Giger Museum”,則 ${museum} 的值將為“fs87b”。
表達式 instance('museums')/root/item[id=${museum}]/geometry 的計算結果為 46.5841618 7.0801379 0 0,這是 ODK 格式中的一個點。

從 XML 檔案建置選擇項目

XML 檔案可作為使用 select_one_from_file 或 select_multiple_from_file 填入選擇問題的資料集。
這通常不如使用 CSV 檔案方便。
但是,了解 XML 表示形式有助於理解如何在 CSV 和 XML 檔案中找到值。
用於選擇的 XML 檔案必須具有以下結構,並且可以具有任意數量的項目區塊:

<root>
  <item>
    <name>...</name>
    <label>...</label>
    ...
  </item>
  ...
</root>

項目區塊類似於 CSV 表示形式中的行。
每個項目必須至少具有名稱和標籤巢狀節點,並且可以具有任意數量的附加節點。
這些節點對應於 CSV 表示形式中的欄位。

在資料集中尋找值

您可以在內部或外部資料集中尋找值。您通常會在calculate (計算)欄位中執行此操作,但您也可以直接在labels(標籤)中尋找值以將其顯示給使用者或在約束或其他表達式中包含查找的值。
用於在資料集中尋找值的表達式始終以 instance("")開頭,以標識正在存取哪個資料集。
如果您有一個名為places的選擇清單或一個檔案名為places.csv的附加CSV,您的尋找表達式將以instance("places")開頭。
表達式的下一部分是 /root/item 。這意味著要考慮您的選擇清單或附加文件中的每一item (項目)。
然後,您通常需要在方括號中新增一個篩選器來指定實際使用的項目。例如,如果您有一個名為 states 的選擇清單或附加文件,並且想要尋找有關使用者在名為 my_state 的表單欄位中輸入的州的值,則可以使用 name = ${my_state} 作為choice_filter(篩選器)表達式。這與您編寫為 choice_filter 的表達式完全相同。
您的過濾表達式可能會導致選擇一項或多項。過濾到包含多個項目的結果對於求和和計數特別有用。

例如,要計算州人口超過特定閾值的數量:

count(instance("states")/root/item[population > ${pop_threshold}])

若要使用所選項目中的單一值,請指定篩選器後要使用的列/屬性。

例如,如果您想尋找使用者填寫為 my_state 的州的人口,則完整表達式為:

instance("states")/root/item[name = ${my_state}]/population

要取得人口超過特定閾值的各州的總人口:

sum(instance("states")/root/item[population > ${pop_threshold}]/population)

您無需深入了解這些表達式的細節即可有效地使用它們。
如果您有興趣了解更多信息,請參閱有關 XPath 路徑(https://docs.getodk.org/form-logic/#xpath-paths)的部分
特別是,/root/item 來自用於表示選擇資料集的 XML 結構(https://docs.getodk.org/form-datasets/#selects-from-xml)。
如果將自訂 XML 檔案附加到表單,則可能有不同的根節點名稱。

附加CSV以進行無需使用選擇小工具的搜尋

如果您想直接在 CSV 中尋找值而不先執行選擇步驟,您可以使用 csv-external 附加該 CSV:
survey

type name label calculation
csv-external people
barcode person_id Scan person's ID card
calculate person_fname instance("people")/root/item[code=${person_id}]/fname

上面的範例表單附加了一個檔案名為 people.csv 的 CSV 或名為 people 的實體清單(https://docs.getodk.org/central-entities/)。
然後,它提示使用者掃描身分證上的條碼,並使用身分證上的值來尋找對應人員的名字。
如果附加實際的 CSV 文件,它必須包含名為 fname 和 code 的欄位。
同樣,如果使用實體列表,則該實體列表必須具有名為 fname 和 code 的屬性。
注意
若要附加名為 people.xml 的 XML 文件,請將上面的 csv-external 替換為 xml-external。


上一篇
Day23: 表單函數(Functions) Part 3
下一篇
Day25: 表格語言(Form Language)
系列文
用 ODK 和 Access VBA 打造行動化資料收集流程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言