Structure-aware multidimensional statistical data exchange for MoonBit
| 能力 | 解决的问题 |
|---|---|
| 结构校验 | 代码表、有序维度、完整键、重复项、必需值及附着属性一致性 |
| 结构感知交换 | CSV 列重排;JSON dataset/series/observation 索引与 keyPosition、多度量、默认及继承属性、注释 |
| 精确值模型 | 缺值与零分开、保留原小数文本、有界精确十进制、报告期区间 |
| 安全转换 | 维度选择、期间查询、保持身份的重排、全代码域无碰撞映射、保留必需元数据的投影 |
| 修订及计划 | 新增/撤回/逐字段修改;全快照前置条件和最终一致性校验的显式本地编辑 |
| 分页与覆盖 | 内容绑定 keyset 游标;缺值、未出现代码及频率分析,不暗中合并不同单位 |
moon update
moon check --target all --deny-warn
moon build --target all --deny-warn
moon test --target all --deny-warn
moon run --target native examples/open_data
moon run --target native examples/department_kpi
moon run --target native examples/research_revision
moon run --target native examples/energy_catalog
moon run --target native --release examples/scalemoon add xingsiyi/moonsdmx@0.1.0let structure = @sdmx.Structure::new(
@sdmx.StructureRef::new("DEMO", "METRICS", "1.0"), [
@sdmx.Component::new("REGION", @sdmx.Dimension, @sdmx.Text),
@sdmx.Component::new("TIME_PERIOD", @sdmx.TimeDimension, @sdmx.Period),
@sdmx.Component::new("OBS_VALUE", @sdmx.Measure, @sdmx.Decimal),
@sdmx.Component::new("UNIT", @sdmx.Attribute(["REGION"]), @sdmx.Text, required=true),
],
)
let row = @sdmx.Observation::new(
structure, ["N", "2026-01"], [Some("1.2300")], [Some("kWh")],
)
let data = @sdmx.Dataset::new(structure, [row])
let message = @sdmx.DataMessage::new(@sdmx.Datastructure, structure.reference(), data)
let json = message.encode_json2(id="demo", sender="DEMO", prepared="2026-10-23T00:00:00Z")
let restored = @sdmx.decode_json2(json, expected=Some(structure))
assert_eq(restored.dataset().fingerprint(), data.fingerprint())| 场景 | 实际结果与失败路径 | 示例 |
|---|---|---|
| 开放数据到仪表盘 | 三层维度展开、单位与注释继承、地区和月份筛选、null 与零保留;注释不能静默丢到 CSV | examples/open_data |
| 部门 KPI 交换 | 共享 DSD 及代码表,接受不同列顺序,拒绝未知部门和附着单位冲突 | examples/department_kpi |
| 研究修订复核 | 1 新增、1 撤回、2 修订;null→0 及状态变化;过期计划拒绝,旧快照不变 | examples/research_revision |
| 能源环境目录迁移 | 全代码域重编码、保留 kWh/MWh 和月/季粒度、两页遍历、过期游标拒绝、覆盖缺口 | examples/energy_catalog |
moon run --target native cmd/moonsdmx -- json2csv MESSAGE.json
moon run --target native cmd/moonsdmx -- json2csv --drop-annotations MESSAGE.json
moon run --target native cmd/moonsdmx -- extract-structure MESSAGE.json
moon run --target native cmd/moonsdmx -- validate-csv STRUCTURE.json DATA.csv
moon run --target native cmd/moonsdmx -- csv2json STRUCTURE.json DATA.csv msg DEMO 2026-10-23T00:00:00Z
moon run --target native cmd/moonsdmx -- reencode-json2 MESSAGE.json msg DEMO 2026-10-23T00:00:00Zpub(all) suberror SdmxError {
Invalid(path~ : String, reason~ : String)
Limit(resource~ : String, maximum~ : Int)
Unsupported(feature~ : String)
Conflict(key~ : String, reason~ : String)
} derive(Debug)pub struct CodeMapping {
// private fields
}fn CodeMapping::new(dimension : String, pairs : Array[(String, String)], limits? : Limits) -> CodeMapping raise SdmxErrorfn Component::new(id : String, role : Role, representation : Representation, name? : String, required? : Bool) -> Component raise SdmxErrorfn DataMessage::annotations_for(self : DataMessage, key : Array[String]) -> Array[Annotation] raise SdmxErrorfn DataMessage::encode_json2(self : DataMessage, id~ : String, sender~ : String, prepared~ : String) -> String raise SdmxErrorfn DataMessage::new(kind : ExchangeKind, reference : StructureRef, dataset : Dataset) -> DataMessage raise SdmxErrorfn DataMessage::with_annotations(self : DataMessage, notes : Array[Annotation], bindings : Array[(Array[String], Array[Int])]) -> DataMessage raise SdmxErrorpub struct DatasetPage {
// private fields
}fn LocalOperation::delete_exact(base : Dataset, key : Array[String]) -> LocalOperation raise SdmxErrorfn LocalOperation::merge_present(base : Dataset, key : Array[String], measures : Array[String?], attributes : Array[String?]) -> LocalOperation raise SdmxErrorfn LocalOperation::replace_observation(base : Dataset, key : Array[String], measures : Array[String?], attributes : Array[String?]) -> LocalOperation raise SdmxErrorfn Observation::new(structure : Structure, key : Array[String], measures : Array[String?], attributes : Array[String?]) -> Observation raise SdmxErrorfn Observation::value(self : Observation, structure : Structure, id : String) -> String? raise SdmxErrorpub struct PageCursor {
// private fields
}pub struct PageSnapshot {
// private fields
}fn PageSnapshot::page(self : PageSnapshot, page_size? : Int, after? : PageCursor?) -> DatasetPage raise SdmxErrorpub struct Selection {
// private fields
}fn StructureRef::new(agency : String, id : String, version : String) -> StructureRef raise SdmxErrorpub(all) struct ValueCoverage {
id : String
reported : Int
omitted : Int
distinct_values : Int
} derive(Debug)fn decode_json2(text : String, expected? : Structure?, limits? : Limits) -> DataMessage raise SdmxErrorInstall
Download zipStructure-aware multidimensional statistical data exchange for MoonBit