JSA读取广发日线数据
wils
创作者俱乐部成员
昨天有朋友问,如何读取广发证券志诚版的day文件里的日线数据
上次读取通达信的day文件时,先创建了结构体,然后把文件中的数据,复制到结构体里再读取
https://bbs.wps.cn/topic/71108
今天尝试不创建结构体,而是直接读取文件中的数据,似乎更方便一些
function rd(n)
{
const a = n >> 28
const b = n & 0x0FFFFFFF
return 10 ** (a) * b
}
function tt()
{
const d = FileSystem.ReadFileAsArrayBuffer(`${ThisWorkbook.Path}\\600000.day`)
const p = FFI.RefPointer(d.buffer)
const r = []
let o = 184
while (o < d.byteLength) {
const t = []
t.push(p.Read("uint32", o))
t.push(rd(p.Read("uint32", o + 4)))
t.push(rd(p.Read("uint32", o + 8)))
t.push(rd(p.Read("uint32", o + 12)))
t.push(rd(p.Read("uint32", o + 16)))
t.push(rd(p.Read("uint32", o + 20)))
t.push(p.Read("uint32", o + 24))
r.push(t)
o += 168
}
ActiveSheet.UsedRange.ClearContents()
Range("A1").Resize(r.length, 7).Value2 = r
}需要注意的是:
这里的日期、成交量,是uint32直接读取就行
但是,价格和成交额是自定义小数,虽然仍占用4字节,但其中高4位是有符号的指数,低28位则是尾数,所以读出来的数字需要处理一下
使用命令可以看的更清楚:
| 🔔 | hexdump -e '1/4 "%d," 5/4 "%x," 1/4 "%d," 35/4 "%x," "\n"' -s 184 -n 2000 600000.day |
最后,希望知道RefPointer在这里用是否正确,还有FFI.DerefPointer()和FFI.RefPointer()两者的区别,希望大佬不吝赐教,多谢