Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 解析NASDAQ.tip文件_R_Regex_Xsd - Fatal编程技术网

R 解析NASDAQ.tip文件

R 解析NASDAQ.tip文件,r,regex,xsd,R,Regex,Xsd,问题:我有一个来自纳斯达克的.tip文件需要解析。官方名称:GENIUM合并饲料 文件i是一个类似csv的文件,带有分号和换行符,用于不同结构的新条目,因此没有固定的标题。但是它有一个对应的xsd schemafile,它应该描述内容和结构,但是我看不到从文件到结构结果的明确方式。已尝试使用列表设置,其中messageType成为列表中的名称 我已经有了一个可以工作的sql代码集来解析文件,但是已经证明它是特定于大小写的,即使是结构上的微小变化,比如不同的键值对的顺序,它都是健壮的。因此,我正

问题:我有一个来自纳斯达克的.tip文件需要解析。官方名称:GENIUM合并饲料
文件i是一个类似csv的文件,带有分号和换行符,用于不同结构的新条目,因此没有固定的标题。但是它有一个对应的xsd schemafile,它应该描述内容和结构,但是我看不到从文件到结构结果的明确方式。已尝试使用列表设置,其中messageType成为列表中的名称

我已经有了一个可以工作的sql代码集来解析文件,但是已经证明它是特定于大小写的,即使是结构上的微小变化,比如不同的键值对的顺序,它都是健壮的。因此,我正在寻找一种方法来利用信息的结构,从而能够生成一个健壮且可维护的解决方案,最好是在R中。我尝试了一些正则表达式匹配,但最终还是得到了许多上下文特定的代码,因此,我希望使用包含关键信息的表或数据框架进行某种结构设计,能够为可持续的解决方案做出贡献

任何提示或建议都是非常受欢迎的

链接到文件和指定键,以及

TIP消息格式TIP协议是一种标记文本协议。A. TIP消息是一系列标记和值对,用 分号。标记是零个或多个大写字符,后跟 小写字符。标记后面紧跟着值。 标签的示例有“FLd”、“STa”。消息中的第一个标记是 始终使用消息类型。消息类型标记没有值。一个例子 消息类型标记的名称为“BDSh”。IP消息用UTF-8编码 除非另有说明。提示消息的最大长度为 以恒定的最大消息长度(2048字节)表示。任何 最大字段长度不包括任何转义字符“\”。没有空值 将被发送;例外情况是消息类型标记和布尔标记( 标记本身的存在对应于“真”值)。暂时 十进制字段(即浮点数据类型)长度以X,Y表示 其中X是字段整数部分的最大位数 (分离器的左侧)。Y是小数位数(数字右边) 分离器)。散布标签的顺序不是固定的,即。 客户不得对标签的顺序做出任何假设。唯一的 消息的固定组件是消息类型,它总是 放在消息数据的第一位。请注意,新的消息和字段 可在协议的未来版本中添加。确保向前 兼容性,客户端应忽略无法识别的消息类型和 字段标记


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

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
库(data.table)
#从本地磁盘读取下载的文件

提示:我知道这个问题至少获得了两次反对票,我可以理解为什么,但请给出我可以改进的建议。这里面有一些隐含的编程问题,但我的问题是,我没有能够设计出一个健壮的设计/策略。提出具体问题,;就像“如何通过xsd规范将csv转换为xml”,我将选择一种特定的策略来解决这个问题。谢谢。他解决了我的问题。特别是[]函数中的'by'子句,这对我来说是新的,我仍然对您的reqex感到有点困惑:“
by=
data.table
语法,不能处理普通的数据帧。reqex也让我吃惊;-)。这是一个背后告诉分裂后。它肯定是这个任务的良好选择。再一次,谢谢
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;
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