楼主: windspeedo
5858 10

[求助]S-Plus读二进制数据文件的问题 [推广有奖]

  • 0关注
  • 0粉丝

已卖:162份资源

初中生

0%

还不是VIP/贵宾

-

威望
0
论坛币
845 个
通用积分
0.1200
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
147 点
帖子
11
精华
0
在线时间
1 小时
注册时间
2008-8-19
最后登录
2016-7-2

楼主
windspeedo 发表于 2008-8-19 11:14:00 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
S-Plus可以通过ReadRaw读取二进制数据文件。但是,好像只能以同一种数据格式读。
如果这个二进制数据文件,例如股票行情的日线文件,包含几列数据,一列长整形long、一列single、一列byte,应该怎么读呢?
网络上整个找不到答案。所有的说明书也都查过。
请教各位大侠。

[此贴子已经被作者于2008-8-20 1:14:39编辑过]

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:PLUS 数据文件 二进制 Plu SINGLE 数据文件 二进制

回帖推荐

luzifer_li 发表于5楼  查看完整内容

R中的readBin可以用来读取不同的列不同类型的数据,如:read.DET.data <- function(f) { counter <- 1 col1.v <- c() col2.v <- c() col3.v <- c()  fid <- file( f ,"rb") tempi <- readBin(fid,"int", n=1)  while ( length(tempi) != 0) {  col1.v[ counter ] <- tempi  col2.v[ counter ] <- readBin(fid, numeric(),n=1)  col ...

本帖被以下文库推荐

沙发
luzifer_li 发表于 2008-8-19 13:52:00

R 的readBin 可以吗?

上传一个日线文件看看。


藤椅
windspeedo 发表于 2008-8-20 00:01:00

附件解压缩后是一个股票的日线数据文件。
已知它的数据结构如下(VBA):
  Type MyType
    a1 As Long  '标示码
    a2 As Long  '日期
    a3 As Single  '开盘价
    a4 As Single  '最高价
    a5 As Single  '最低价
    a6 As Single  '收盘价
    a7 As Single  '成交金额
    a8 As Long    '成交量
End Type

查阅了帮助中关于ReadBin的介绍和示例,好像也还是用于读取同质的数据。


多谢大侠援手。
238259.rar (7.32 KB) 本附件包括:

  • sh600686.day

[此贴子已经被作者于2008-8-20 0:07:39编辑过]

板凳
birdnick 发表于 2008-8-20 01:40:00

明天试一下哈

报纸
luzifer_li 发表于 2008-8-20 10:49:00

R中的readBin可以用来读取不同的列不同类型的数据,如:

read.DET.data <- function(f) {
 counter <- 1
 col1.v <- c()
 col2.v <- c()
 col3.v <- c()
 
 fid <- file( f ,"rb")
 tempi <- readBin(fid,"int", n=1)
 
 while ( length(tempi) != 0) {
  col1.v[ counter ] <- tempi
  col2.v[ counter ] <- readBin(fid, numeric(),n=1)
  col3.v[ counter ] <- readBin(fid, character(),n=1)
  counter <- counter + 1
  tempi <- readBin(fid, integer(),n=1)
 }
 close( fid )

  data.frame(col1=col1.v,col2=col2.v,col3=col3.v)

  #list(col1.v,col2.v,col3.v)
}

zz <- file("testbin", "wb")
writeBin(1:1, zz)
writeBin(3.23, zz)
writeBin("char1",zz)
writeBin(2:2, zz)
writeBin(2*3.23, zz)
writeBin("char2",zz)
close(zz)

read.DET.data("testbin")

#  col1 col2  col3
#1    1 3.23 char1
#2    2 6.46 char2

但首先你得对你的日线文件的数据格式有了解。呵呵。

已有 1 人评分论坛币 学术水平 热心指数 收起 理由
crystal8832 + 10 + 1 + 1 热心帮助其他会员

总评分: 论坛币 + 10  学术水平 + 1  热心指数 + 1   查看全部评分

地板
windspeedo 发表于 2008-8-20 22:33:00

luzifer牛人啊。

我一开始还纳闷,read.DET.data这个命令在S-Plus中不存在。

仔细学习才明白,luzifer的意思是自己写个接口函数。还提供了示范代码。

非常感谢。我会认真学习编写一下代码。

顺便说一下,这个日线文件的数据格式就是3楼所说的数据格式。

多谢luzifer花费时间。

[此贴子已经被作者于2008-8-20 22:37:47编辑过]

7
windspeedo 发表于 2008-8-20 23:22:00

我在S-Plus中运行如下代码,基本就是5楼的代码。

read.DET.data <- function(f) {
 counter <- 1
 col1.v <- c()
 col2.v <- c()
 col3.v <- c()
 
 fid <- file( f ,"rb")
 tempi <- readBin(fid,integer(), n=1)
 
 while ( length(tempi) != 0) {
  col1.v[ counter ] <- tempi
  col2.v[ counter ] <- readBin(fid, numeric(),n=1)
  col3.v[ counter ] <- readBin(fid, character(),n=1)
  counter <- counter + 1
  tempi <- readBin(fid, integer(),n=1)
 }
 close( fid )

  data.frame(col1=col1.v,col2=col2.v,col3=col3.v)

  #list(col1.v,col2.v,col3.v)
}

zz <- file("testbin.dat", "wb")
writeBin(1,zz)
writeBin(3.23,zz)
writeBin("char1",zz)
writeBin(2,zz)
writeBin(2*3.23,zz)
writeBin("char2",zz)
close(zz)


read.DET.data("testbin.dat")

#  col1 col2  col3
#1    1 3.23 char1
#2    2 6.46 char2

运行结果如下:

> read.DET.data <- function(f)
{
 counter <- 1
 col1.v <- c()
 col2.v <- c()
 col3.v <- c()
 fid <- file(f, "rb")
 tempi <- readBin(fid, integer(), n = 1)
 while(length(tempi) != 0) {
  col1.v[counter] <- tempi
  col2.v[counter] <- readBin(fid, numeric(), n = 1)
  col3.v[counter] <- readBin(fid, character(), n = 1)
  counter <- counter + 1
  tempi <- readBin(fid, integer(), n = 1)
 }
 close(fid)
 data.frame(col1 = col1.v, col2 = col2.v, col3 = col3.v)
}
> zz <- file("testbin.dat", "wb")
> writeBin(1, zz)
NULL
> writeBin(3.23, zz)
NULL
> writeBin("char1", zz)
NULL
> writeBin(2, zz)
NULL
> writeBin(2 * 3.23, zz)
NULL
> writeBin("char2", zz)
NULL
> close(zz)
[1] T
> read.DET.data("testbin.dat")
fread: No error
Problem in readBin(fid, integer(), n = 1): error reading data
Use traceback() to see the call stack

搞了半天,还是不明白为什么会出这个错误。

好像代码没有问题啊。

完全复制5楼代码,结果同样。

[此贴子已经被作者于2008-8-20 23:23:56编辑过]

8
windspeedo 发表于 2008-8-21 00:34:00

我琢摩这个错误“error reading data ”,可能是因为那个读取文件内容的循环的问题。

至少在S-Plus中,当readBin读完了整个文件后,你再要它读一个integer出来,它就干净利落地抱错,而不是返回一个零长度的object.

那么,S-Plus怎么检测文件的底部呢?S-Plus好像没有EOF()函数阿。

是不是只能用file.info取到文件大小然后硬算出循环次数?

[此贴子已经被作者于2008-8-21 1:38:05编辑过]

9
luzifer_li 发表于 2008-8-21 09:56:00

用软件打开3楼附件中的sh600686.day文件是什么样的?能不能给个截图。

现在不好确定你说的long,single, byte各占的byte数。

没用过splus,问题是不是在wirteBin(1,zz), 怎么返回的NULL值?

10
windspeedo 发表于 2008-8-21 12:53:00

S-Plus中,writeBin返回NULL是正常的。

我已经能够读取数据。就是无法检测EOF。因为S-Plus没有象R一样,对文件结束后的readBin返回零字节的object.

但是,通过计算,可以事先确定文件中记录的数目。也算是正确的编程。完全可以解决我的问题。

关于S-Plus中,如何检测二进制文件的EOF,可以作为另一问题,留待其他高手解决了。

再次感谢,请查收email。

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-9 08:06