是否有比LOAD / NEXT更精细的粒度来读取结构化数据?

时间:2010-11-04 03:37:43

标签: rebol seek structured-data

想象一下,我有一个长文件的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结构数据的这种需求,甚至可能允许随机访问插入?

3 个答案:

答案 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可以轻松加载:

  • 员工姓名而非员工姓名
  • $ 10203.04而不是$ 10'203.04
  • 10% - 仅适用于REBOL3

如果你不能像这样调整数据格式,你可以在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]