2010-11-04 40 views
1

想象一下,我有雷博尔格式的数据的一个长的文件,用万线,这看起来像读取结构化数据时是否有比LOAD/NEXT更细的粒度?

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结构化数据的需求,甚至可以允许随机访问插入?

回答

1

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

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

+0

为此使用PARSE非常有趣,你让我想知道LOAD如何在引擎盖下工作。当我看着时,我很惊讶它是一个夹层,它似乎读取整个数据源(即使你只是在做/下一步!)不确定的确切细节,但基于PARSE的LOAD夹层会有更多的增量阅读自然,并能够加载/返回? – HostileFork 2010-11-08 19:44:01

+0

一个问题是PARSE不能在PORT上工作!目前,请参阅http://stackoverflow.com/questions/4127569/using-parse-on-a-port-value – HostileFork 2010-11-08 20:05:51

+0

关于LOAD/BACK - 这当然是可以写的,但是有一个折衷 - 它需要时间和努力,而且这种用法只是例外。 – Ladislav 2010-12-27 09:55:18

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。

+0

是的,这是可能的...但我希望以全谱的东西相对更稳健Rebol数据格式。 Ladislav提出了PARSE,但它不适用于PORT!http://stackoverflow.com/questions/4127569/using-parse-on-a-port-value – HostileFork 2010-11-08 20:06:31

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] 
+0

如果您有大数据文件,您可以添加一些缓冲区,并且不要一次读取所有文件。 – Oldes 2010-11-05 10:34:19

+0

btw ..最好的解决方案是不使用数据的封闭块:) – Oldes 2010-11-05 10:45:26

+0

ATTEMPT显然有点狡猾,因为它假设你的数据是格式良好的。但是,感谢您付出努力为问题中描述的特定方案编写解决方案的代码。我真的在思考一个可以在磁盘文件上工作的更普遍的“寻道”,但后来认识到,即使解析器能够加载/返回,那么无法进行修改也意味着它只会对非常有用狭窄的环境...... – HostileFork 2010-11-08 19:27:37