gdata形式のファイルについて、具体的な取扱いに関する情報が載っているサイトをご存知ですか?
そのファイルの特徴、他形式のものとの違い、プログラミング言語との親和性等が知りたいです。
gdataファイルは、例えば以下のように記述されています。
@bf34cd9a-d653-42ce-90d2-0e0b3beb0316 { #2479056145 items :: dp_item_list : <object>[ dp(int) : @de86b58e-a2a5-4779-b793-96c137480cc1 { #3605065401 value :: int : 1; #460587879 name :: string : "INT_test"; }]; }
ご教授のほど、よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/05 05:29
2018/05/05 07:09
回答2件
0
ベストアンサー
察するに、EBGuideのフォーマットですね
gdata形式のファイルについて、具体的な取扱いに関する情報が載っているサイトをご存知ですか?
フォーマットの情報は一般に公開されていません
僕もElektrobitに問い合わせましたが、法人対応のみとのことで回答をもらえませんでした
そのファイルの特徴、他形式のものとの違い、プログラミング言語との親和性等が知りたいです。
フォーマットはほぼjsonそのままですので、気合で読めると思います。
↓ここがプロパティの実体の宣言で
#2479056145 items :: dp_item_list : <object>
↓ここがオブジェクトの実体の宣言です。
dp(int) : @de86b58e-a2a5-4779-b793-96c137480cc1 { #3605065401 value :: int : 1; #460587879 name :: string : "INT_test"; }
1つのプロパティは、オブジェクト、あるいは普通の数値や文字列を(通常)1つ持ちます。
1つのオブジェクトは複数のプロパティを持ちます。
ただし、質問に記述されている例は1つのプロパティは複数のオブジェクトを配列として持つ特殊な例です。
何らかの情報を抜き取りたい場合、python(ply)やC++(flex/bison)でパースするしかないと思います。
パーサジェネレータを使って遊んでいる人であれば、以下のコードが参考になるかもしれません。
(ちょっと前に書いてたやつなので、バグとかあったらごめんなさい)
python
1#!/usr/bin/env python 2import ply.lex as lex 3from ply.lex import TOKEN 4 5# 6#PRINT = print 7PRINT = lambda x : None 8 9#--------------------------------------------------------------------- 10# define states 11states = ( 12 ('text', 'exclusive'), 13 ('version', 'exclusive'), 14) 15 16#--------------------------------------------------------------------- 17# define literals 18literals = "()[]{}<>@#;," 19 20#--------------------------------------------------------------------- 21#define regular expression parts 22def PAREN(t): 23 t = r'(' + t + r')' 24 return t 25INTEGER_NUMBER_INTEGER = r'[+-]?[1-9][0-9]*[Ff]?|[+-]?0' 26INTEGER_NUMBER_FLOAT = r'[+-]?[1-9][0-9]*[Ff]?|[+-]?0[fF]?' 27INTEGER_NUMBER = PAREN(INTEGER_NUMBER_INTEGER) + "|" + PAREN(INTEGER_NUMBER_FLOAT ); 28REAL_NUMBER = PAREN(INTEGER_NUMBER_INTEGER) + r'?' + r'.[0-9]*[fF]?' 29NUMBER = PAREN(REAL_NUMBER) + r'|' + PAREN(INTEGER_NUMBER) 30 31#--------------------------------------------------------------------- 32# declare token 33tokens = ( 34 'NUMBER', 35 'EBGUIDE', 36 'BOOL', 37 'PROP_ID', 38 'OBJ_ID', 39 "START_TEXT", 40 'END_TEXT', 41 'TEXT', 42 'SYMBOL', 43 'VERSION', 44) 45 46#--------------------------------------------------------------------- 47# defien ignore token 48t_ignore = ' \t:' 49t_text_ignore = '' 50t_version_ignore = '' 51 52#--------------------------------------------------------------------- 53# define token by RE 54#t_EBGUIDE = r'EBGUIDE' 55 56#--------------------------------------------------------------------- 57# define token as function by state 58 59def t_ANY_newline(t): 60 r'\n+' 61 t.lexer.lineno += len(t.value) 62 63@TOKEN(NUMBER) 64def t_NUMBER(t): 65 PRINT(t.value) 66 t.value = t.value.replace("f", "") 67 t.value = t.value.replace("F", "") 68 t.value = float(t.value) 69 return t 70def t_EBGUIDE(t): 71 r'EBGUIDE' 72 PRINT(t.value) 73 t.lexer.push_state("version") 74 return t 75def t_BOOL(t): 76 r'true|false' 77 PRINT(t.value) 78 t.value = True if t.value == "true" else False 79 return t 80def t_PROP_ID(t): 81 r'\#[0-9]+' 82 PRINT(t.value) 83 return t 84def t_OBJ_ID(t): 85 r'@[a-zA-Z0-9\-]+' 86 PRINT(t.value) 87 return t 88def t_START_TEXT(t): 89 r'"' 90 PRINT(t.value) 91 t.lexer.push_state("text") 92def t_SYMBOL(t): 93 r'[a-zA-Z][a-zA-Z0-9_()\,]*' 94 PRINT(t.value) 95 return t 96 97def t_text_TEXT(t): 98 r'([^"\]|\"|\)+' 99 PRINT(t.value) 100 return t 101def t_text_END_TEXT(t): 102 r'"' 103 PRINT(t.value) 104 t.lexer.pop_state() 105 106def t_version_VERSION(t): 107 r'[^;]+' 108 PRINT(t.value) 109 return t 110def t_version_END_VERSION(t): 111 r';' 112 PRINT(t.value) 113 t.lexer.pop_state() 114 t.type = ';' 115 t.value = ';' 116 return t 117 118#--------------------------------------------------------------------- 119# define error function 120def t_ANY_error(t): 121 print("不正な文字 '%s'" % t.value[0]) 122 print(t.lineno) 123 t.lexer.skip(1) 124 125#--------------------------------------------------------------------- 126# declare instance 127lex.lex(debug=0) 128 129#--------------------------------------------------------------------- 130# main process 131 132# debug main 133def debug_main(): 134 #data = open('test.txt').read() 135 data = input() 136 lex.input(data) 137 while(True): 138 tok = lex.token() 139 if not tok: 140 break 141 142# debug entry point 143if __name__ == "__main__": 144 debug_main() 145
python
1#!/usr/bin/env python 2from ...ExImports import * 3import ply.yacc as yacc 4from .lex import tokens 5from ..Common import * 6 7def p_input(p): 8 'input : EBGUIDE VERSION ";" file_root' 9 p[0] = p[4] 10 11def p_flie_root(p): 12 'file_root : OBJ_ID object' 13 p[0] = p[1] 14 15def p_object(p): 16 'object : "{" properties "}"' 17 p[0] = p[2] 18 19def p_properties(p): 20 '''properties : 21 | properties simple_property 22 | properties data_binded_property 23 | properties nest_property''' 24 if (len(p) == 1): 25 p[0] = [] 26 return 27 p[0] = p[1] 28 p[0].append(p[2]) 29 30def p_simple_property(p): 31 ''' simple_property : PROP_ID SYMBOL SYMBOL text ";" 32 | PROP_ID SYMBOL SYMBOL NUMBER ";" 33 | PROP_ID SYMBOL SYMBOL BOOL ";" 34 | PROP_ID text SYMBOL text ";" 35 | PROP_ID text SYMBOL NUMBER ";" 36 | PROP_ID text SYMBOL BOOL ";" ''' 37 p[0] = p[1] 38 SimpleProperty(p[1], p[2], p[3], p[4]) 39 40def p_data_binded_property(p): 41 ''' data_binded_property : PROP_ID text SYMBOL prop_id ";" ''' 42 p[0] = p[1] 43 SimpleProperty(p[1], p[2], p[3], p[4]) 44 45def p_nest_property(p): 46 ''' nest_property : PROP_ID SYMBOL SYMBOL OBJ_ID object 47 | PROP_ID SYMBOL SYMBOL array ";" 48 | PROP_ID text SYMBOL OBJ_ID ";" 49 | PROP_ID text SYMBOL OBJ_ID object 50 | PROP_ID text SYMBOL array ";"''' 51 p[0] = p[1] 52 SimpleProperty(p[1], p[2], p[3], p[4]) 53 54def p_text(p): 55 '''text : 56 | TEXT''' 57 p[0] = reduce(lambda x, y: x + y, p[1:], "") 58 59def p_prop_id(p): 60 '''prop_id : PROP_ID 61 | OBJ_ID PROP_ID''' 62 p[0] = reduce(lambda x, y: x + y, p[1:], "") 63 64def p_array(p): 65 '''array : array_header "[" "]" 66 | array_header "[" obj_array "]" 67 | array_header "[" int_array "]" 68 | array_header "[" text_array "]" 69 | array_header "[" obj_ref_array "]" 70 | array_header "[" prop_ref_array "]"''' 71 p[0] = p[4] if len(p) != 4 else [] 72 73def p_array_header(p): 74 'array_header : "<" SYMBOL ">"' 75 76def p_obj_array(p): 77 '''obj_array : nameless_obj 78 | obj_array "," nameless_obj''' 79 p[0] = [] if len(p) == 2 else p[1] 80 p[0].append(p[-1]) 81 82def p_int_array(p): 83 '''int_array : NUMBER 84 | int_array "," NUMBER''' 85 p[0] = [] if len(p) == 2 else p[1] 86 p[0].append(p[-1]) 87 88def p_text_array(p): 89 '''text_array : TEXT 90 | text_array "," TEXT''' 91 p[0] = [] if len(p) == 2 else p[1] 92 p[0].append(p[-1]) 93 94def p_obj_ref_array(p): 95 '''obj_ref_array : OBJ_ID 96 | obj_ref_array "," OBJ_ID''' 97 p[0] = [] if len(p) == 2 else p[1] 98 p[0].append(p[-1]) 99 100def p_prop_ref_array(p): 101 '''prop_ref_array : prop_id 102 | prop_ref_array "," prop_id ''' 103 p[0] = [] if len(p) == 2 else p[1] 104 p[0].append(p[-1]) 105 106def p_nameless_obj(p): 107 'nameless_obj : SYMBOL OBJ_ID object' 108 p[0] = p[3] 109 110# syntax error 111def p_error(p): 112 print ('Syntax error in input %s' %p) 113 114parser = yacc.yacc() 115 116# Debug 117def parse(data, debug=0): 118 return yacc.parse(data, debug=debug) 119 120if __name__ == '__main__': 121 data = open('test.txt').read() 122 result = parser.parse(data)
投稿2018/05/05 08:03
編集2018/05/05 08:58総合スコア58
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
一般的にファイル形式が定められているものの中では存じません。
これを扱うソフトウェアの仕様次第です。
投稿2018/05/05 05:26
総合スコア4830
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。