我有一个file,其中包含原始/二进制数据和ascii。 它包含一个时间戳和一个表示速度的无符号16位值。 我想用'R'绘制该速度,因此读取该文件。
该文件的定义是:
自午夜以来的毫秒数 - 在ascii中
+':$'
+ BufferStr
+#13#10
然后,BufferString包含我想要提取的以下信息:
字节3:序列字(无符号)
字节4和5:速度(无符号)
...
我想生成一个包含2列时间和速度
的表我的approch是将文件作为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,但我无法生成我的列表。
我很高兴任何提示
答案 0 :(得分: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)