質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • Python

    7992questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • C++

    3455questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • JSON

    1153questions

    JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

  • ファイル

    170questions

    ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

gdataファイルの扱いについて

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 249

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";
        }];
}


ご教授のほど、よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • y_waiwai

    2018/05/05 12:36

    そのgdata形式のファイルとはどこから出てきたものを想定されてますか?

    キャンセル

  • sigmacshaling

    2018/05/05 14:29

    某開発ツールを使用して作業をする際に、生成されるファイルです。

    キャンセル

  • y_waiwai

    2018/05/05 16:09

    某、ですか。その開発ツールのメーカに問い合わせてください、としか言いようがありませんね

    キャンセル

回答 2

checkベストアンサー

+1

察するに、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)でパースするしかないと思います。
パーサジェネレータを使って遊んでいる人であれば、以下のコードが参考になるかもしれません。
(ちょっと前に書いてたやつなので、バグとかあったらごめんなさい)

#!/usr/bin/env python
import ply.lex as lex
from ply.lex import TOKEN

#
#PRINT = print
PRINT = lambda x : None

#---------------------------------------------------------------------
# define states
states = (
    ('text', 'exclusive'),
    ('version', 'exclusive'),
)

#---------------------------------------------------------------------
# define literals
literals = "()[]{}<>@#;,"

#---------------------------------------------------------------------
#define regular expression parts
def PAREN(t):
    t = r'(' + t + r')' 
    return t
INTEGER_NUMBER_INTEGER = r'[+-]?[1-9][0-9]*[Ff]?|[+-]?0'
INTEGER_NUMBER_FLOAT = r'[+-]?[1-9][0-9]*[Ff]?|[+-]?0[fF]?'
INTEGER_NUMBER = PAREN(INTEGER_NUMBER_INTEGER) + "|" + PAREN(INTEGER_NUMBER_FLOAT );
REAL_NUMBER = PAREN(INTEGER_NUMBER_INTEGER) + r'?' + r'\.[0-9]*[fF]?'
NUMBER = PAREN(REAL_NUMBER) + r'|' + PAREN(INTEGER_NUMBER)

#---------------------------------------------------------------------
# declare token
tokens = (
  'NUMBER',
  'EBGUIDE',
  'BOOL',
  'PROP_ID',
  'OBJ_ID',
  "START_TEXT",
  'END_TEXT',
  'TEXT',
  'SYMBOL',
  'VERSION',
)

#---------------------------------------------------------------------
# defien ignore token 
t_ignore = ' \t:'
t_text_ignore = ''
t_version_ignore = ''

#---------------------------------------------------------------------
# define token by RE
#t_EBGUIDE = r'EBGUIDE'

#---------------------------------------------------------------------
# define token as function by state

def t_ANY_newline(t):
    r'\n+'
    t.lexer.lineno += len(t.value)

@TOKEN(NUMBER)
def t_NUMBER(t):
    PRINT(t.value)
    t.value = t.value.replace("f", "")
    t.value = t.value.replace("F", "")
    t.value = float(t.value)
    return t
def t_EBGUIDE(t):
    r'EBGUIDE'
    PRINT(t.value)
    t.lexer.push_state("version")
    return t
def t_BOOL(t):
    r'true|false'
    PRINT(t.value)
    t.value = True if t.value == "true" else False
    return t
def t_PROP_ID(t):
    r'\#[0-9]+'
    PRINT(t.value)
    return t
def t_OBJ_ID(t):
    r'@[a-zA-Z0-9\-]+'
    PRINT(t.value)
    return t
def t_START_TEXT(t):
    r'"'
    PRINT(t.value)
    t.lexer.push_state("text")
def t_SYMBOL(t):
    r'[a-zA-Z][a-zA-Z0-9_\(\)\,]*'
    PRINT(t.value)
    return t

def t_text_TEXT(t):
    r'([^"\\]|\\"|\\)+'
    PRINT(t.value)
    return t
def t_text_END_TEXT(t):
    r'"'
    PRINT(t.value)
    t.lexer.pop_state()

def t_version_VERSION(t):
    r'[^;]+'
    PRINT(t.value)
    return t
def t_version_END_VERSION(t):
    r';'
    PRINT(t.value)
    t.lexer.pop_state()
    t.type = ';'
    t.value = ';'
    return t 

#---------------------------------------------------------------------
# define error function
def t_ANY_error(t):
    print("不正な文字 '%s'" % t.value[0])
    print(t.lineno)
    t.lexer.skip(1)

#---------------------------------------------------------------------
# declare instance
lex.lex(debug=0)

#---------------------------------------------------------------------
# main process

# debug main
def debug_main():
    #data = open('test.txt').read()
    data = input()
    lex.input(data)
    while(True):
        tok = lex.token()
        if not tok:
            break

# debug entry point
if __name__ == "__main__":
    debug_main()
#!/usr/bin/env python
from ...ExImports import *
import ply.yacc as yacc
from .lex import tokens
from ..Common import *

def p_input(p):
    'input : EBGUIDE VERSION ";" file_root'
    p[0] = p[4]

def p_flie_root(p):
    'file_root : OBJ_ID object'
    p[0] = p[1]

def p_object(p):
    'object : "{" properties "}"'
    p[0] = p[2]

def p_properties(p):
    '''properties : 
    | properties simple_property
    | properties data_binded_property
    | properties nest_property'''
    if (len(p) == 1):
        p[0] = []
        return
    p[0] = p[1]
    p[0].append(p[2])

def p_simple_property(p):
    ''' simple_property : PROP_ID SYMBOL SYMBOL text ";" 
    | PROP_ID SYMBOL SYMBOL NUMBER ";" 
    | PROP_ID SYMBOL SYMBOL BOOL ";" 
    | PROP_ID text SYMBOL text ";" 
    | PROP_ID text SYMBOL NUMBER ";" 
    | PROP_ID text SYMBOL BOOL ";" '''
    p[0] = p[1]
    SimpleProperty(p[1], p[2], p[3], p[4])

def p_data_binded_property(p):
    ''' data_binded_property : PROP_ID text SYMBOL prop_id ";" '''
    p[0] = p[1]
    SimpleProperty(p[1], p[2], p[3], p[4])

def p_nest_property(p):
    ''' nest_property : PROP_ID SYMBOL SYMBOL OBJ_ID object 
    | PROP_ID SYMBOL SYMBOL array ";" 
    | PROP_ID text SYMBOL OBJ_ID ";" 
    | PROP_ID text SYMBOL OBJ_ID object 
    | PROP_ID text SYMBOL array ";"'''
    p[0] = p[1]
    SimpleProperty(p[1], p[2], p[3], p[4])

def p_text(p):
    '''text : 
    | TEXT'''
    p[0] = reduce(lambda x, y: x + y, p[1:], "")

def p_prop_id(p):
    '''prop_id : PROP_ID
    | OBJ_ID PROP_ID'''
    p[0] = reduce(lambda x, y: x + y, p[1:], "")

def p_array(p):
    '''array : array_header "[" "]" 
    | array_header "[" obj_array "]"
    | array_header "[" int_array "]"
    | array_header "[" text_array "]"
    | array_header "[" obj_ref_array "]"
    | array_header "[" prop_ref_array "]"'''
    p[0] = p[4] if len(p) != 4 else []

def p_array_header(p):
    'array_header : "<" SYMBOL ">"'

def p_obj_array(p):
    '''obj_array : nameless_obj 
    | obj_array "," nameless_obj'''
    p[0] = [] if len(p) == 2 else p[1]
    p[0].append(p[-1])

def p_int_array(p):
    '''int_array : NUMBER
    | int_array "," NUMBER'''
    p[0] = [] if len(p) == 2 else p[1]
    p[0].append(p[-1])

def p_text_array(p):
    '''text_array : TEXT
    | text_array "," TEXT'''
    p[0] = [] if len(p) == 2 else p[1]
    p[0].append(p[-1])

def p_obj_ref_array(p):
    '''obj_ref_array : OBJ_ID
    | obj_ref_array "," OBJ_ID'''
    p[0] = [] if len(p) == 2 else p[1]
    p[0].append(p[-1])

def p_prop_ref_array(p):
    '''prop_ref_array : prop_id 
    | prop_ref_array  "," prop_id '''
    p[0] = [] if len(p) == 2 else p[1]
    p[0].append(p[-1])

def p_nameless_obj(p):
    'nameless_obj : SYMBOL OBJ_ID object'
    p[0] = p[3]

# syntax error
def p_error(p):
    print ('Syntax error in input %s' %p)

parser = yacc.yacc()

# Debug
def parse(data, debug=0):  
    return yacc.parse(data, debug=debug)

if __name__ == '__main__':  
    data = open('test.txt').read()
    result = parser.parse(data)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/06 12:22

    回答ありがとうございます。
    EBGuideを使っていると言うと、何だかまずい気がしたのですが、国内でもよく知られているツールなのですかね。

    キャンセル

0

一般的にファイル形式が定められているものの中では存じません。

これを扱うソフトウェアの仕様次第です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python

    7992questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • C++

    3455questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • JSON

    1153questions

    JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

  • ファイル

    170questions

    ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。