2010-11-04 41 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