TOC

  1. Intro
  2. TagModel
  3. Structure
  4. TimeZones
  5. Units
  6. Grids
  7. Filters
  8. Zinc
    1. 概述
    2. 字面量
    3. 语法
    4. 语法
    5. 注意事项
      1. 标识符与关键字
      2. 数字令牌
      3. 时间
  9. Json
  10. Trio
  11. Csv
  12. Rest
  13. Ops
  14. Auth
  15. VFDs
  16. Networks
  17. Energy
  18. Zones
  19. AHUs
  20. VAVs
  21. UnitaryEquips
  22. Chillers
  23. Boilers
  24. Tanks
  25. ElecPanels
  26. Lighting
  27. Builds
  28. Bacnet
  29. ChangeLog
  30. License
Filters Json

Zinc

概述

Zinc 表示“Zinc不是CSV”。Zinc是一种用于序列化 Haystack 网格的纯文本语法,它使用一种增强的CSV格式。与CSV不同的是,Zinc支持有类型的标量值(如Bool,Int,Float,Str,Date等)以及网格和列级别的任意元数据。 它也与JSON不同,Zinc对表格数据的压缩率要高得多。

字面量

在Zinc的基本语法中,为每种类型都使用了自定义的字面量语法:

语法

每个网格都有一行元数据应用于整个网格,后跟一列列定义,然后是零行或多行。每行用 "\n" (换行符)分隔。

元数据行必须以ver标签开头并且值为"3.0"。我们来看一个简单的例子:

ver:"3.0"
firstName,bday
"Jack",1973-07-23
"Jill",1975-11-15

注意,第一行定义了仅仅是版本标签的元数据。第二行定义了两个名为'firstName'和'bday'的列。有两个数据行,每个数据行包含firstName的Str值和bday的Date值。

元数据可以在网格本身或每个列上指定为一组 名称/值 标签。标签被指定为"name:val",或者 如果值为空那么它是一个标记标签。标签由空格分隔。下面是一个例子:

ver:"3.0" database:"test" dis:"Site Energy Summary"
siteName dis:"Sites", val dis:"Value" unit:"kW"
"Site 1", 356.214kW
"Site 2", 463.028kW

通常有稀疏表,其中行的某些给定列是空值。这可以使用字面量 N 或者完全省略来表示。例如下面这两行语义上相同的:

"a",N,2,N,N,"z"
"a",,2,,,"z"

如果只有一列,那么空行必须用 N 字符表示。

任何元数据或单元格值都可以使用嵌套列表,词典或网格:

ver:"3.0"
type,val
"list",[1,2,3]
"dict",{dis:"Dict!" foo}
"grid",<<
  ver:"2.0"
  a,b
  1,2
  3,4
  >>
"scalar","simple string"

语法

Zinc的正式 BNF 语法:

<grid>        :=  <gridMeta> <cols> [<row>]*
<gridMeta>    :=  <ver> <tags> <nl>
<ver>         :=  "ver:" <str>
<tags>        :=  [<tag>]*   // separated by one space (0x20)
<tag>         :=  <tagMarker> | <tagPair>
<tagMarker>   :=  <id>  // val is assumed to be Marker
<tagPair>     :=  <id> ":" <val>
<cols>        :=  <col> ["," <col>]* <nl>
<col>         :=  <id> <tags>
<row>         :=  <cell> ["," <cell>]* <nl>
<cell>        :=  <val>  // empty cell is same as null
<val>         :=  <scalar> | <list> | <dict> | <grid>
<list>        :=  "[" (<val> ",")* "]"  // trailing comma allowed/optional
<dict>        :=  "{" <tags> "}"
<grid>        :=  "<<" <grid> ">>"

Zinc tokens:

<id>          :=  <alphaLo> (<alphaLo> | <alphaHi> | <digit> | '_')*

<scalar>      :=  <null> | <marker> | <na> | <bool> | <ref> | <bin> | <str> |
                  <uri> | <number> | <date> | <time> | <dateTime> | <coord> | <xstr>

<null>        := "N"
<marker>      := "M"
<na>          := "NA"
<bool>        := "T" | "F"

<ref>         := "@" <refChar>* [ " " <str> ]
<refChar>     := <alpha> | <digit> | "_" | ":" | "-" | "." | "~"

<str>         := """ <strChar>* """
<uri>         := "`" <uriChar>* "`"
<strChar>     := <unicodeChar> | <strEscChar>
<uriChar>     := <unicodeChar> | <uriEscChar>
<unicodeChar> := any 16-bit Unicode char >= 0x20 (except str/uri quote)
<strEscChar>  := "\b" | "\f" | "\n" | "\r" | "\r" | "\t" | "\"" | "\\" | "\$" | <uEscChar>
<uriEscChar>  := "\:" | "\/" | "\?" | "\#" | "\[" | "\]" | "\@" | "\`" | "\\" | "\&" | "\=" | "\;" | <uEscChar>
<uEscChar>    := "\u" <hexDigit> <hexDigit> <hexDigit> <hexDigit>

<xstr>        := <xstrType> "(" <str> ")"
<xstrType>    := <alphaHi> (<alphaLo> | <alphaHi> | <digit> | '_')*

<number>      := <decimal> | "INF" | "-INF" | "NaN"
<decimal>     := ["-"] <digits> ["." <digits>] [<exp>] [<unit>]
<exp>         := ("e"|"E") ["+"|"-"] <digits>
<unit>        := <unitChar>*
<unitChar>    := <alpha> | "%" | "_" | "/" | "$" | any char > 128  // see Units

<date>        := YYYY-MM-DD
<time>        := hh:mm:ss.FFFFFFFFF
<dateTime>    := YYYY-MM-DD'T'hh:mm:ss.FFFFFFFFFz zzzz

<coord>       := "C(" <coordDeg> "," <coordDeg> ")"
<coordDeg>    := ["-"] <digits> ["." <digits>]

<alphaLo>     := ('a' - 'z')
<alphaHi>     := ('A' - 'Z')
<alpha>       := <alphaLo> | <alphaHi>
<digit>       := ('0' - '9')
<digits>      := <digit> (<digit> | "_")*
<hexDigit>    := ('a'-'f') | ('A'-'F') | digit

允许在令牌之间使用空格字符0x20。

注意事项

以下是实施者提出的注意事项:

标识符与关键字

标识符必须以小写字母开头。关键字以大写字母开头:"N","T","F","Bin","INF","NaN"等

数字令牌

解析时,前导数字可能是数字,日期,时间或日期时间。您可以使用以下技术来处理这些标量:

  1. 将所有各种字符转化到字符串中
  2. 如果是破折号没有冒号一定是日期
  3. 如果是冒号没有破折号一定是时间
  4. 如果冒号和破折号必须是dateTime,请检查 Z 或时区
  5. 必须是可选单位的数字

时间

DateTime标量使用偏移量和时区名称进行编码:

2010-11-28T07:23:02.773-08:00 Los_Angeles // 负偏移和时区
2010-11-28T23:19:29.741+08:00 Taipei      // 正偏移和时区
2010-11-28T18:21:58+03:00 GMT-3           // 时区可能包含 '-'
2010-11-28T12:22:27-03:00 GMT+3           // 时区可能包含 '+'
2010-01-08T05:00:00Z UTC                  // UTC 例子
2010-01-08T05:00:00Z                      // UTC可能会省略时区名称
Filters Json