Unidata-从多值字段中提取字符串计数

时间:2018-12-14 15:40:12

标签: unidata multivalue-database

关于Unidata,我还是个新手。

我的问题是这个

我有20个字段的大量记录。我想提取这些字段1中使用的不同值的总计计数;该字段是多值字段,因此数据看起来像“CSR²STR²CD2”等。

我想输出到excel,以便数据看起来像下面的样子,其中包含每个值的COUNT及其在所有记录中在该字段中出现的次数。

Column1 Column2
CSR 234235
STR 987346
CD2 736252

有人告诉我可以使用计算此子程序或子程序的字典来实现。但是我在Unidata方面的技术基础很少,因此从哪里开始有点超出我的范围。

2 个答案:

答案 0 :(得分:1)

听起来您需要爆炸式的排序吗?多值(MV)字段虽然在基本代码中非常方便,但在查询语言中可能很难解决。对它们有明确的支持,但是它不像非MV数据那样简单。关键是进行“爆炸式”排序,这将使MV字段变平-我认为这是为每个MV字段创建“虚拟”行。如果存在多个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.

答案 1 :(得分:0)

根据您的需求,解决方案将有所不同。例如...

您可以使用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

适合您的用例吗?