2014-05-02 24 views
3

我有一个file其中包含原始/二进制数据和ascii。 它包含一个时间戳和一个表示速度的无符号16位值。 我想用'R'来绘制速度,因此读取该文件。读取并转换二进制原始数据R

文件的定义是:

自午夜起,以ASCII毫秒


+ ':$'
+ BufferStr
+#13#10

的BufferString然后包含我想提取的以下信息:

字节3:序列字(无符号)
字节4和5:速度(无符号)
...

我想生成2列时间和速度表

我的计算策略是为CSV一次读取文件获取时间戳列。

library(bit) 
dataPath="rawdata.txt" 
#to create time col read file as csv: 
rwch=read.csv(dataPath, sep=":") 

然后再次以二进制形式读取该文件。 我把文件分割成27行,这是一行的长度。

#read binary 
to.read = file(path, "rb") 
rw=readBin(to.read, what="raw", n = 100*27, endian = "big") 
rws=split(rw, ceiling(seq_along(rw)/27)) 

但后来我卡住了。由此产生的向量不包含原始数据,我无法再次分割它,以便将速度从其中分离出来。 我试过了几个函数,如hexView,readRaw,但我无法生成我的列表。

我很高兴对任何暗示

回答

2

这真是最好的连接上使用readBin(),您正在处理,而不是试图读取整个文件(除非是在一个文件中只有一个data.type ,但在这里你有混合类型在这里)。这似乎适用于您的示例文件。

N<-28 
RC<-27 
secs<-numeric(N) 
speeds<-numeric(N) 
con<-file("/rawdata.txt", "rb") 
for(i in seq.int(N)) { 
    print(i) 
    secs[i] <- as.numeric(readChar(con,8)) 
    stopifnot(readChar(con,2)==":$") #check 
    readBin(con,"raw",3) #skip 3 bytes 
    speeds[i] <- readBin(con, "int",1,2, signed=F) 
    readBin(con,"raw",10) #skip 10 bytes 
    stopifnot(readBin(con,"raw",2)==c(13,10)) #check 
} 
data.frame(secs,speeds) 
close(con) 
+0

非常感谢。我现在有一个美丽的速度曲线。 – Sami

+0

只是一个小小的更正。由于第3个字节已经包含我的数据,所以我不得不跳过2个字节。但是现在我知道,附件中没有包含Speed。 – Sami

+0

这很有道理。我认为测试文件中的速度值看起来有点奇怪。 – MrFlick

相关问题