1

次のような 100 万行の 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、従業員項目を一度に 1 つずつ読み取るために使用できます (ファイル全体を で構造化データに解析するのとは対照的ですLOAD)。囲んでいるブロックがある場合、同様のことを行う方法はありますか?

以前にアクセスした項目に戻りたい場合はどうすればよいですか? 「構造的なシーク」はありますか?

この種の Rebol 構造化データに対する要求に使用できる実行可能なデータベース ソリューションはありますか?

4

3 に答える 3

1

これがPARSEで実行可能であることを証明したのはあなただったことを思い出しますか?;-)

それにもかかわらず、有用な答えを与えるために:リンクテキスト用に私が書いたコードは、何か他のものが必要なときにデフォルトのLOAD / NEXTを使用しないREBOLの解析(本質的に)として正確に説明できます。ですから、見て、ドキュメントを読み、テストを実行し、いくつかのテストを書いてください。さらに質問がある場合は、質問してください。

于 2010-11-04T19:48:12.467 に答える
1

複数行のデータを持つことができるので、スナンダの答えは良くありません!次のようなものを使用できます。

データ:{REBOL []

[
    [従業員名:{Tony Romero}給与:$ 10'203.04]
    [従業員名:{Marcus "Marco" Marcami}給与:デフォルト]
    [従業員名:{Serena Derella}の給与:($ 10,000 + $ 203.04)]
]}

すべての場合を除いて[
    [値データ]ロード/次のデータを設定します
    値='REBOL
] [print "REBOLデータファイルではありません!" 停止]
[ヘッダーデータ]ロード/次のデータを設定します
print ["data-file-header:"モールドヘッダー]
データ:検索/テールデータ# "["

試み [
    ;ファイルの終わりに少なくとも1つのエラーがあるため、attemptを使用する必要があります。
    ; **構文エラー:ブロックの終わりに[がありません
    インデックス:コピー[]
    その間 [
        インデックスデータを追加
        [ロードされた行のデータ]ロード/次のデータを設定します
        データ
    ][
        ロードされたプローブ-行
    ]

]
「完了」を印刷

バックテールインデックスを削除します;最後の誤った位置を削除します

foreachdata-at-posリバースインデックス[
    最初のロード/次のデータの位置をプローブ
]

したがって、出力は次のようになります。

[従業員名: "Tony Romero"給与:$ 10203.04]
[従業員名:{Marcus "Marco" Marcami}給与:デフォルト]
[従業員名:「SerenaDerella」の給与:($ 10000.00 + $ 203.04)]
終わり
[従業員名:「SerenaDerella」の給与:($ 10000.00 + $ 203.04)]
[従業員名:{Marcus "Marco" Marcami}給与:デフォルト]
[従業員名: "Tony Romero"給与:$ 10203.04]
于 2010-11-05T10:27:40.970 に答える
1

ファイル形式を少し調整して、1 行に 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

....アンロードされた文字列のブロックを取得します

それらを使用する 1 つの方法は次のとおりです。

foreach record data [
    record: make object! load/all record
    probe record
]

REBOL で簡単にロードできるように、データ形式も微調整する必要がありました。

  • 従業員名ではなく従業員名
  • $10'203.04 ではなく $10203.04
  • 10% -- REBOL3 でのみ動作

そのようにデータ形式を微調整できない場合は、LOAD/ALL の前に各文字列を編集して、REBOL 用に正規化することができます。

于 2010-11-04T08:54:20.470 に答える