首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析NASDAQ .tip文件

解析NASDAQ .tip文件
EN

Stack Overflow用户
提问于 2017-05-15 20:35:26
回答 1查看 361关注 0票数 0

问题:我有一个来自纳斯达克的.tip文件,我需要解析它。官方名称: GENIUM合并饲料

该文件I为csv类文件,带有分号和换行符,用于不同结构的新条目,因此没有固定的标题。但是它有一个相应的xsd模式文件,它应该描述内容和结构,但是我看不到从文件到结构结果的明确方式。尝试使用列表设置,其中messageType成为列表中的名称

代码语言:javascript
复制
x <- scan("cran_tasks/NOMX_Comm_Close2.tip", what="", sep="\n")
y <- strsplit(x, ';')
names(y) <- sapply(y, `[[`, 1)
y <- sapply(y, `[`, -1, simplify = FALSE)
y <- sapply(y, as.list) 

该文件的结构如下:

代码语言:javascript
复制
messageType;key1Value;key2Value;...;..;/n  
messageType;key1Value;key2Value;.....;/n    

BDSr;i2;NAmGITS;  
BDx;i106;Si18;s2;SYmNC;NAmNASDAQ OMX Commodities;CNyNO;MIcNORX;  
BDm;i672;Si018171;s2;Ex106;NAmFuel Oil;SYmNCFO;TOTa+0200;LDa20141011;  
BDIs;i10142;SiNP;s2;ISsNP;NAmNord Pool ASA;  
m;i122745;t191500.001;Dt20170509;ISOcY;ISOtY;
m;i122745;t192808.721;Dt20170509;ISOcN;ISOtY;SEp275.45;  
Oi;i122745;t054425.600;OPi2840;

我已经设置了一个工作的sql代码来解析这个文件,但是它已经证明是特定于特定情况的,对于结构上的微小变化,比如不同的keyValue对的顺序,都是健壮的。所以我正在寻找方法来利用信息的结构,以便能够做出一个健壮的、可维护的解决方案,最好是在R中。我尝试了一些正则表达式匹配,但最后我还是得到了很多特定于上下文的代码,所以我希望一些包含关键信息的表或数据结构可以为一个可持续的解决方案提供帮助。

任何暗示或建议都是非常欢迎的。

链接到XML/XSD文件和指定键的html工作表以及.tip文件

提示消息格式提示协议是一个标记的文本协议。提示消息是用分号分隔的标记和值对的序列。标签是0或更多大写字符,后面是小写字符。标记后面紧跟着值。标记的例子有"FLd“、"STa”。消息中的第一个标记总是消息类型。消息类型标记没有值。消息类型标记的一个例子是"BDSh“。除非另有说明,IP消息是用UTF-8编码的。提示消息的最大长度由常量MAX_MESSAGE_LENGTH (2048字节)指示。任何最大字段长度都不包括任何转义字符“\”。不会发送空值;例外是消息类型标记和布尔标记(标记本身的存在对应于“true”值)。对于十进制字段(即浮点数据类型),长度给定为X,Y,其中X是字段整数部分(分隔符左侧)的最大数字数。Y是小数(分隔符的右边)。传播标签的顺序不是固定的,即客户不能对标签的顺序作出任何假设。消息的唯一固定组件是消息类型,它总是放在消息数据的第一位。请注意,新的消息和字段可能会添加到协议的未来版本中。为了确保前向兼容性,客户端应忽略未识别的消息类型和字段标记。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-22 07:30:02

下面的data.table解决方案解析给定的.tip文件,并返回带有标记和值对的data.table。因此,这可能是进一步提取相关数据的一个良好起点。

代码语言:javascript
复制
library(data.table)

# read downloaded file from local disk
tip_wide <- fread(
  "NOMX_Comm_Close2.tip"
  , sep = "\n"
  , header = FALSE
)

# split tip messages into tag and value pairs
# thereby rehaping from wide to long format
# and adding a row number
tip_long <- tip_wide[, unlist(strsplit(V1, ";")), 
                     by = .(rn = seq_len(nrow(tip_wide)))]

# get message type tag as the first entry of each message
msg_type <- tip_long[, .(msg.type = first(V1)), by = rn]
# make message type a separate column for each tag-value-pair using join
# remove unnecessary rows
tip_result <- msg_type[long, on = "rn"][msg.type != V1]

# split tag and value pairs
tip_result[, c("tag", "value") := 
             data.table(stringr::str_split_fixed(V1, "(?<=^[A-Z]{0,9}[a-z])", 2))]

tip_result
#           rn msg.type        V1 tag   value
#     1:     1     BDSr        i2   i       2
#     2:     1     BDSr   NAmGITS NAm    GITS
#     3:     2      BDx      i106   i     106
#     4:     2      BDx      Si18  Si      18
#     5:     2      BDx        s2   s       2
#    ---                                     
#905132: 95622     BDCl        s2   s       2
#905133: 95622     BDCl  i2368992   i 2368992
#905134: 95622     BDCl Il2368596  Il 2368596
#905135: 95622     BDCl       Op1  Op       1
#905136: 95622     BDCl       Ra1  Ra       1

请注意,value列的类型为字符。

正则表达式"(?<=^[A-Z]{0,9}[a-z])"使用一个面向后断言(参见?"stringi-search-regex")来定义拆分模式。请注意,这里使用的是{0,9}而不是*,因为后面的模式不能是无界的(no *或+操作符)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43988380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档