首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将FIX消息格式("Tag=Value")转换为CSV

将FIX消息格式("Tag=Value")转换为CSV
EN

Stack Overflow用户
提问于 2014-10-28 13:37:33
回答 2查看 2K关注 0票数 5

我有一个35=S (Quote;"Tag=Value")的csv/log文件,我需要将这些速率提取到一个适合数据挖掘的CSV文件中。这并不是严格的修复相关的,它更多的是一个R相关的问题,如何清理一个数据集。

原始消息如下所示:

代码语言:javascript
运行
复制
190=1.1204 ,191=-0.000029,193=20141008,537=0        ,631=1.12029575,642=0.000145,10=56
190=7.20425,191=0.000141 ,537=0       ,631=7.2034485,10=140        ,            ,
190=1.26237,191=0        ,537=1       ,10=068       ,              ,            ,

我首先需要获得一个中间数据集,它看起来像这样,其中相同的标记是对齐的。

代码语言:javascript
运行
复制
190=1.1204 ,191=-0.000029,193=20141008,537=0,631=1.12029575,642=0.000145,10=56
190=7.20425,191=0.000141 ,            ,537=0,631=7.2034485 ,            ,10=140
190=1.26237,191=0        ,            ,537=1,              ,            ,10=068

这反过来又需要转化为:

代码语言:javascript
运行
复制
190    ,191      ,193     ,537,631       ,642     ,10
1.1204 ,-0.000029,20141008,0  ,1.12029575,0.000145,56
7.20425,0.000141 ,        ,0  ,7.2034485 ,        ,140
1.26237,0        ,        ,1  ,          ,        ,068

我正在用awk开发bash脚本,但我不知道我能否在R中完成,目前,我最大的挑战是到达中间表。从中间表到最后一个表,我考虑在tidyr包中使用R,特别是函数‘分离’。如果有人能提出更好的逻辑,我会非常感激的!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-28 14:51:55

另一种可能性。开头与@Andrie相同的scan,但也使用参数strip.whitena.strings

代码语言:javascript
运行
复制
x <- scan(text = "190=1.1204 ,191=-0.000029,193=20141008,537=0        ,631=1.12029575,642=0.000145,10=56
190=7.20425,191=0.000141 ,537=0       ,631=7.2034485,10=140        ,            ,
190=1.26237,191=0        ,537=1       ,10=068       ,              ,            ,",
           sep = ",",
           what = "character", 
           strip.white = TRUE,
           na.strings = "")

# remove NA
x <- x[!is.na(x)]

然后使用来自colsplit包的dcastreshape2包:

代码语言:javascript
运行
复制
library(reshape2)

# split 'x' into two columns
d1 <- colsplit(string = x, pattern = "=", names = c("x", "y")) 

# create an id variable, needed in dcast
d1$id <- ave(d1$x, d1$x, FUN = seq_along)   

# reshape from long to wide
d2 <- dcast(data = d1, id ~ x, value.var = "y")

#   id  10     190       191      193 537      631      642
# 1  1  56 1.12040 -0.000029 20141008   0 1.120296 0.000145
# 2  2 140 7.20425  0.000141       NA   0 7.203449       NA
# 3  3  68 1.26237  0.000000       NA   1       NA       NA

因为你提到了tidyr

代码语言:javascript
运行
复制
library(tidyr)
d1 <- separate(data = data.frame(x), col = x, into = c("x", "y"), sep = "=")
d1$id <- ave(d1$x, d1$x, FUN = seq_along)
spread(data = d1, key = x, value = y)
#   id  10     190       191      193 537        631      642
# 1  1  56  1.1204 -0.000029 20141008   0 1.12029575 0.000145
# 2  2 140 7.20425  0.000141     <NA>   0  7.2034485     <NA>
# 3  3 068 1.26237         0     <NA>   1       <NA>     <NA>

这保留了作为character的值。如果您想要numeric,可以在spread中设置convert = TRUE

票数 4
EN

Stack Overflow用户

发布于 2014-10-28 13:57:15

编辑。只使用基本R函数的完整解决方案:

代码语言:javascript
运行
复制
dat <- scan(sep=",", what="character", text="190=1.1204 ,191=-0.000029,193=20141008,537=0        ,631=1.12029575,642=0.000145,10=56
190=7.20425,191=0.000141 ,537=0       ,631=7.2034485,10=140        ,            ,
190=1.26237,191=0        ,537=1       ,10=068       ,              ,            ,")

dat <- gsub(" ", "", dat)
dat <- dat[dat != ""]

x <- as.data.frame(
  matrix(
    unlist(
      sapply(dat, strsplit, split = "=", USE.NAMES=FALSE)
    ),
    ncol=2, byrow=TRUE
  )
)

z <- unstack(x, V2 ~ V1)

结果对象是接近您所需的命名列表。如果需要,您将不得不做一些额外的工作来将其转换为矩阵。

代码语言:javascript
运行
复制
$`10`
[1] "56"  "140" "068"

$`190`
[1] "1.1204"  "7.20425" "1.26237"

$`191`
[1] "-0.000029" "0.000141"  "0"   

....
etc.     

从这里开始,您只需使用适当数量的NA值填充列表:

代码语言:javascript
运行
复制
maxLength <- max(sapply(z, length))
sapply(z, function(x)c(as.numeric(x), rep(NA, maxLength - length(x))))

给予:

代码语言:javascript
运行
复制
      10     190       191      193 537      631      642
[1,]  56 1.12040 -0.000029 20141008   0 1.120296 0.000145
[2,] 140 7.20425  0.000141       NA   0 7.203449       NA
[3,]  68 1.26237  0.000000       NA   1       NA       NA
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26609810

复制
相关文章

相似问题

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