2014-05-02 27 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

相關問題