1

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

4

3 回答 3

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。

于 2010-11-04T08:54:20.470 回答
1

我记得,是你证明了这在 PARSE 中应该是可行的?;-)

尽管如此,为了给您一个有用的答案:我为链接文本编写的代码可以完全描述为解析(本质上)REBOL,而不是在需要其他内容时使用默认的 LOAD/NEXT。所以,看看,阅读文档,运行测试,写一些测试,如果你有更多问题,尽管问。

于 2010-11-04T19:48:12.467 回答
1

Sunanda 的回答不好,因为您可以拥有多行数据!你可以使用类似的东西:

数据:{REBOL []

[
    [员工姓名:{Tony Romero} 薪水:$10'203.04]
    [员工姓名:{Marcus "Marco" Marcami} 薪水:默认]
    [员工姓名:{Serena Derella} 薪水:($10,000 + $203.04)]
]}

除非所有 [
    设置 [值数据] 加载/下一个数据
    值 = 'REBOL
][ print "不是 REBOL 数据文件!" 停止 ]
设置 [标题数据] 加载/下一个数据
print ["data-file-header:" 模具头]
数据:查找/尾数据#“[”

试图 [
    ;您必须使用尝试,因为文件末尾至少会出现一个错误!
    ;** 语法错误:在块末尾缺少 [
    索引:复制 []
    尽管 [
        追加索引数据
        set [loaded-row data] 加载/下一个数据
        数据
    ][
        探针加载行
    ]

]
打印“完成”

删除后尾索引;删除最后一个错误位置

foreach data-at-pos 反向索引 [
    探测第一个加载/下一个数据在位置
]

所以输出将是:

[员工姓名:“托尼·罗梅罗”薪水:$10203.04]
[员工姓名:{Marcus "Marco" Marcami} 薪水:默认]
[员工姓名:“Serena Derella”薪水:($10000.00 + $203.04)]
完毕
[员工姓名:“Serena Derella”薪水:($10000.00 + $203.04)]
[员工姓名:{Marcus "Marco" Marcami} 薪水:默认]
[员工姓名:“托尼·罗梅罗”薪水:$10203.04]
于 2010-11-05T10:27:40.970 回答