2016-10-02 5 views
3

文字列変換の問題を処理中です。PARSEの自己定義トークンに一致します

line: {INSERT INTO `pub_company` VALUES ('1', '0', 'ABC大学', 'B', 'admin', '2014-10-09 11:40:44', '', '105210', null)} 

==> 

line: {INSERT INTO `pub_company` VALUES ('1', '0', 'ABC大学', 'B', 'admin', to_date('2014-10-09 11:40:44', 'yyyy-mm-dd hh24:mi:ss'), '', '105210', null)} 

'2014-10-09 11:40:44'to_date('2014-10-09 11:40:44', 'yyyy-mm-dd hh24:mi:ss')に変換される要件は、このようなものです。

私のコードは以下のようになります。

date: use [digit][ 
    digit: charset "" 
    [4 digit "-" 2 digit "-" 2 digit space 2 digit ":" 2 digit ":" 2 digit] 
] 
parse line [ to date to end] 

が、私はこのエラーを得た:date値の位置であるため

probe parse "SSS 2016-01-01 00:00:00" [thru 3 "S" space date to end] ;true 
probe parse "SSS 2016-01-01 00:00:00" [ to date to end] ; the error above 

:私はいくつかのテストを行った

** Script error: PARSE - invalid rule or usage of rule: digit 
** Where: parse do either either either -apply- 
** Near: parse line [to date to end] 

を私のすべてのデータセットで同じではない、どのように私はそれに到達し、それに一致し、対応する変更を行うことができますか?

答えて

3

:ここ

line: {INSERT INTO `pub_company` VALUES ('1', '0', 'ABC大学', 'B', 'admin', '2014-10-09 11:40:44', '', '105210', null)} 

d: [2 digit] 
parse/all line [some [p1: {'} 4 digit "-" d "-" d " " d ":" d ":" d {'} p2: (insert p2 ")" insert p1 "to_date(") | skip]] 

>> {INSERT INTO `pub_company` VALUES ('1', '0', 'ABC??', 'B', 'admin', to_date('2014-10-09 11:40:44'), '', '105210', null)} 
3

TOとTHRUは、歴史的に任意のルールをパラメータとして許可していません。 #2129

"The syntax of TO and THRU is currently restricted by design, for really significant performance reasons..."

これはrelaxed in Redです。したがって、たとえば、次のようにそこに動作します:

parse "aabbaabbaabbccc" [ 
    thru [ 
     some "a" (prin "a") some "b" (prin "b") some "c" (prin "c") 
    ] 
] 

しかし、それは出力:

abababababc 

これはそれが本当に解析ルールを適用するだけで、「単純に」より良い答えを持っていないことを示しています各ステップで繰り返します。 PARSEエンジンのループは、より高速な探索方法が存在するTO/THRUを原子的に実行するほど効率的ではありません(基本的な文字列検索など)。また、括弧内のコードの繰り返し実行は、実際に意図されていたものと一致しない場合があります。

まだ...許可する方が良いようです。その後、ユーザーのコードが遅いときには心配し、重要であればパフォーマンスを調整します。したがって、RebolのRen-C branchはこの点でRedと揃えられ、任意のルールが許可される可能性があります。

+0

こんにちはHostileFork、あなたの説明に感謝します。私はこれの理由を知っている。私は間接的にそれを作った。 –

2
私は間接的な方法でそれを作った

date: use [digit][ 
    digit: charset "" 
    [4 digit "-" 2 digit "-" 2 digit space 2 digit ":" 2 digit ":" 2 digit] 
] 

line: {INSERT INTO `pub_company` VALUES ('1', '0', 'ABC大学', 'B', 'admin', '2014-10-09 11:40:44', '', '105210', null)} 

parse line [ 
    thru "(" vals: (
     blk: parse/all vals "," 
     foreach val blk [ 
      if parse val [" '" date "'"][ 
       ;probe val 
       replace line val rejoin [ { to_date(} at val 2 {, 'yyyy-mm-dd hh24:mi:ss')}] 
      ] 
     ] 
    ) 
    to end 
    (probe line) 
] 

出力:私は以下のように行った

{INSERT INTO `pub_company` VALUES ('1', '0', 'ABC大学', 'B', 'admin', to_date('2014-10-09 11:40:44', 'yyyy-mm-dd hh24:mi:ss'), '', '105210', null)} 
2

真Rebol2ソリューション

line: {INSERT INTO `pub_company` VALUES ('1', '0', 'ABC??', 'B', 'admin', '2014-10-09 11:40:44', '', '105210', null)} 
date: use [digit space][ 
    space: " " 
    digit: charset "" 
    [4 digit "-" 2 digit "-" 2 digit space 2 digit ":" 2 digit ":" 2 digit] 
] 

>> parse/all line [ some [ [da: "'" date (insert da "to_date (") 11 skip de: (insert de " 'yyyy-mm-dd hh24:mi:ss'), ") ] | skip ] ] 
== true 
>> probe line 
{INSERT INTO `pub_company` VALUES ('1', '0', 'ABC??', 'B', 'admin', to_date ('2014-10-09 11:40:44', 'yyyy-mm-dd hh24:mi:ss'), '', '105210', null)} 
関連する問題