想象一下,我有一个长文件的Rebol格式数据,有一百万行,看起来像
REBOL []
[
[employee name: {Tony Romero} salary: $10,203.04]
[employee name: {Marcus "Marco" Marcami} salary: default]
[employee name: {Serena Derella} salary: ($10,000 + $203.04)]
...
[employee name: {Stacey Christie} salary: (10% * $102,030.40)]
]
如果没有封闭块,我可以使用LOAD/NEXT
一次一个地读取员工项目(而不是使用LOAD
将整个文件解析为结构化数据)。如果封闭块 那么有没有办法做类似的事情?
如果我想回到以前访问过的项目怎么办?可能存在“结构性寻求”吗?
是否有一个可行的数据库解决方案可以用于Rebol结构数据的这种需求,甚至可能允许随机访问插入?
答案 0 :(得分:1)
如果您乐意稍微调整一下文件格式,那么它是一个每行一条记录的文件,没有封闭的块也没有REBOL标题:
employee-name: {Tony Romero} salary: $10203.04
employee-name: {Marcus "Marco" Marcami} salary: 'default
employee-name: {Serena Derella} salary: ($10000 + $203.04)
employee-name: {Stacey Christie} salary: (10% * $102030.40)
然后...
data: read/lines %data-file.txt
....为你提供一个卸载字符串块
使用它们的一种方法是:
foreach record data [
record: make object! load/all record
probe record
]
我不得不调整你的数据格式,以便REBOL可以轻松加载:
如果你不能像这样调整数据格式,你可以在LOAD / ALL之前对每个字符串进行一些编辑,以便为REBOL标准化它。
答案 1 :(得分:1)
我记得,是你证明了这一点,这在PARSE中应该可行吗? ; - )
然而,为了给你一个有用的答案:我为link text编写的代码可以完全描述为解析(实质上)REBOL在需要其他东西时不使用默认的LOAD / NEXT。所以,看一看,阅读文档,运行测试,编写一些测试,如果你有更多问题,请问。
答案 2 :(得分:1)
Sunanda的答案并不好,因为您可以拥有多行数据! 你可以使用类似的东西:
data: {REBOL [] [ [employee name: {Tony Romero} salary: $10'203.04] [employee name: {Marcus "Marco" Marcami} salary: default] [employee name: {Serena Derella} salary: ($10'000 + $203.04)] ]} unless all [ set [value data] load/next data value = 'REBOL ][ print "Not a REBOL data file!" halt ] set [header data] load/next data print ["data-file-header:" mold header] data: find/tail data #"[" attempt [ ;you must use attempt as there will be at least one error at the end of file! ;** Syntax Error: Missing [ at end-of-block indexes: copy [] while [ append indexes data set [loaded-row data] load/next data data ][ probe loaded-row ] ] print "done" remove back tail indexes ;removes the last erroneous position foreach data-at-pos reverse indexes [ probe first load/next data-at-pos ]
所以输出结果为:
[employee name: "Tony Romero" salary: $10203.04] [employee name: {Marcus "Marco" Marcami} salary: default] [employee name: "Serena Derella" salary: ($10000.00 + $203.04)] done [employee name: "Serena Derella" salary: ($10000.00 + $203.04)] [employee name: {Marcus "Marco" Marcami} salary: default] [employee name: "Tony Romero" salary: $10203.04]