Unidata - 从多值字段中提取字符串计数
Unidata - Extract Count of strings from MultiValued fields
我是 Unidata 的新手。
我的问题是这样的;
我有很多包含 20 个字段的记录。我想提取其中一个字段中使用的不同值的总计数;有问题的字段是多值的,所以数据看起来像 "CSR²STR²CD2" 等
我想输出到 excel,因此数据如下所示,包含每个值的计数以及它在所有记录中出现在该字段中的次数。
Column1 Column2
CSR 234235
STR 987346
CD2 736252
有人告诉我我可以使用计算这个的字典或子程序来实现这个。但是我对 Unidata 的技术基础很少,所以从哪里开始有点超出我的范围。
根据您的需要,解决方案会有所不同。例如...
您可以使用 SREFORMAT 命令将特定属性的值提取到新文件中,然后轻松地从该文件中获取项目计数。在您的示例中,您将拥有一个属性为 1 的项目 CSR,其中包含包含 CSR 的项目的所有键。然后你只需要另一个 dict 项来显示 atb1 的值计数。这将导致您所描述的确切输出。
您可以使用如下代码以编程方式执行此操作。
* Assume a1 looks like CSR]CD2]CSR]CSR]CD2...
VALS = DCOUNT(REC<1>,@VM)
COUNTS = ""
FOR V = 1 TO VALS
LOCATE(REC<1,V>,COUNTS,1;POS) THEN
COUNTS<2,POS> += 1
END ELSE
COUNTS<1,-1> = REC<1,V>
COUNTS<2,-1> = 0
END
NEXT V
* Result in COUNTS:
* A1 = CSR]CD2
* A2 = 3]2
这适合您的用例吗?
听起来你需要爆炸排序?多值 (MV) 字段虽然在 Basic 代码中非常方便,但在查询语言中处理起来可能有点麻烦。对它们有明确的支持,但它不像非 MV 数据那么简单。关键是进行 "exploding" 排序,这将使 MV 字段变平 - 我认为它是为每个 MV 字段创建 "virtual" 行。如果有多个 MV 字段并且它们彼此正确关联,它们将在虚拟行中链接在一起。单值和非关联 MV 字段将在每个虚拟行中复制。很难解释,但对于您的问题,这里有一个示例查询:
查询及结果:
>sort IAN.TEMP BY.EXP ATB BREAK.ON ATB TOTAL COUNTER ID.SUP DET.SUP
ATB.. COUNT
CD2 3
CD3 3
CD4 2
CSR 3
IAN 2
=====
TOTAL 13
13 records listed
设置词典:
>AE DICT IAN.TEMP ATB COUNTER
< 1 > Top of "ATB" in "DICT IAN.TEMP", 7 lines, 11 characters.
*--: P
001: D
002: 1
003:
004:
005: 5L
006: M <--- This is very important! Must be M (or MV) for BY.EXP to work
007: <--- If there are associated MV fields, this needs to be populated
Bottom.
*--: EX
Quit "ATB" in file "DICT IAN.TEMP" unchanged.
< 2 > Top of "COUNTER" in "DICT IAN.TEMP", 6 lines, 10 characters.
*--: P
001: I
002: 1 <-- This just returns "1" for every row in the output, to help with totals
003:
004:
005: 5R
006: S
Bottom.
*--: EX
Quit "COUNTER" in file "DICT IAN.TEMP" unchanged.
设置示例数据:
>AE IAN.TEMP *
4 record(s) selected.
< 1 > Top of "3" in "IAN.TEMP", 1 line, 7 characters.
*--: P
001: CD2▒IAN
Bottom.
*--: EX
Quit "3" in file "IAN.TEMP" unchanged.
< 2 > Top of "1" in "IAN.TEMP", 1 line, 15 characters.
*--: P
001: CSR▒CD2▒CD3▒IAN
Bottom.
*--: EX
Quit "1" in file "IAN.TEMP" unchanged.
< 3 > Top of "4" in "IAN.TEMP", 1 line, 15 characters.
*--: P
001: CSR▒CD2▒CD3▒CD4
Bottom.
*--: EX
Quit "4" in file "IAN.TEMP" unchanged.
< 4 > Top of "2" in "IAN.TEMP", 1 line, 11 characters.
*--: P
001: CD4▒CD3▒CSR
Bottom.
*--: EX
Quit "2" in file "IAN.TEMP" unchanged.
我是 Unidata 的新手。
我的问题是这样的;
我有很多包含 20 个字段的记录。我想提取其中一个字段中使用的不同值的总计数;有问题的字段是多值的,所以数据看起来像 "CSR²STR²CD2" 等
我想输出到 excel,因此数据如下所示,包含每个值的计数以及它在所有记录中出现在该字段中的次数。
Column1 Column2
CSR 234235
STR 987346
CD2 736252
有人告诉我我可以使用计算这个的字典或子程序来实现这个。但是我对 Unidata 的技术基础很少,所以从哪里开始有点超出我的范围。
根据您的需要,解决方案会有所不同。例如...
您可以使用 SREFORMAT 命令将特定属性的值提取到新文件中,然后轻松地从该文件中获取项目计数。在您的示例中,您将拥有一个属性为 1 的项目 CSR,其中包含包含 CSR 的项目的所有键。然后你只需要另一个 dict 项来显示 atb1 的值计数。这将导致您所描述的确切输出。
您可以使用如下代码以编程方式执行此操作。
* Assume a1 looks like CSR]CD2]CSR]CSR]CD2...
VALS = DCOUNT(REC<1>,@VM)
COUNTS = ""
FOR V = 1 TO VALS
LOCATE(REC<1,V>,COUNTS,1;POS) THEN
COUNTS<2,POS> += 1
END ELSE
COUNTS<1,-1> = REC<1,V>
COUNTS<2,-1> = 0
END
NEXT V
* Result in COUNTS:
* A1 = CSR]CD2
* A2 = 3]2
这适合您的用例吗?
听起来你需要爆炸排序?多值 (MV) 字段虽然在 Basic 代码中非常方便,但在查询语言中处理起来可能有点麻烦。对它们有明确的支持,但它不像非 MV 数据那么简单。关键是进行 "exploding" 排序,这将使 MV 字段变平 - 我认为它是为每个 MV 字段创建 "virtual" 行。如果有多个 MV 字段并且它们彼此正确关联,它们将在虚拟行中链接在一起。单值和非关联 MV 字段将在每个虚拟行中复制。很难解释,但对于您的问题,这里有一个示例查询:
查询及结果:
>sort IAN.TEMP BY.EXP ATB BREAK.ON ATB TOTAL COUNTER ID.SUP DET.SUP
ATB.. COUNT
CD2 3
CD3 3
CD4 2
CSR 3
IAN 2
=====
TOTAL 13
13 records listed
设置词典:
>AE DICT IAN.TEMP ATB COUNTER
< 1 > Top of "ATB" in "DICT IAN.TEMP", 7 lines, 11 characters.
*--: P
001: D
002: 1
003:
004:
005: 5L
006: M <--- This is very important! Must be M (or MV) for BY.EXP to work
007: <--- If there are associated MV fields, this needs to be populated
Bottom.
*--: EX
Quit "ATB" in file "DICT IAN.TEMP" unchanged.
< 2 > Top of "COUNTER" in "DICT IAN.TEMP", 6 lines, 10 characters.
*--: P
001: I
002: 1 <-- This just returns "1" for every row in the output, to help with totals
003:
004:
005: 5R
006: S
Bottom.
*--: EX
Quit "COUNTER" in file "DICT IAN.TEMP" unchanged.
设置示例数据:
>AE IAN.TEMP *
4 record(s) selected.
< 1 > Top of "3" in "IAN.TEMP", 1 line, 7 characters.
*--: P
001: CD2▒IAN
Bottom.
*--: EX
Quit "3" in file "IAN.TEMP" unchanged.
< 2 > Top of "1" in "IAN.TEMP", 1 line, 15 characters.
*--: P
001: CSR▒CD2▒CD3▒IAN
Bottom.
*--: EX
Quit "1" in file "IAN.TEMP" unchanged.
< 3 > Top of "4" in "IAN.TEMP", 1 line, 15 characters.
*--: P
001: CSR▒CD2▒CD3▒CD4
Bottom.
*--: EX
Quit "4" in file "IAN.TEMP" unchanged.
< 4 > Top of "2" in "IAN.TEMP", 1 line, 11 characters.
*--: P
001: CD4▒CD3▒CSR
Bottom.
*--: EX
Quit "2" in file "IAN.TEMP" unchanged.