對step文件進行信息抽取算法

任務描述:給定一個step文件,對該文件的字符串進行信息抽取,結構化的組織文件描述模型的數據。造成抽象化數據結構,存入計算機數據庫。並能按照有條理結構把這些數據展現出來。java

信息抽取的結果描述:python

  1 數據結構:mysql

    以key-value鍵值對形式將step文件描述的信息抽取並組織起來。算法

    具體的,在java當中使用javabean技術,以類的嵌套的方式實現這種數據結構。sql

  2 結果展現:數據庫

    將javabean轉換成json並格式化打印出來,查看轉化結果是否正確。json

  3 存儲:數組

    將javabean的實例化對象映射爲mysql中的數據庫表。數據結構

 

信息抽取的方法描述: 團隊商討,編寫一套算法來實現對step文件的抽取。spa

  step文件信息抽取算法(僞代碼流程):

  輸入: step文件

  輸出: 鍵值對數據結構(字典、或hashtable、或hashmap、或javabean對象) 和 json格式打印輸出

  1   讀取step文件,整個文件存爲字符串s

  2   刪除s的開頭的 "ISO-10303-21\n" 和最後的 "END-ISO-10303-21\n"

  3   搜索s,將 「HEADER\n「 和在此以後第一個「ENDSEC\n「 中間的部分,存爲字符串header 

  4   搜索s,將 "DATA\n" 和在此以後第一個"ENDSEC\n"中間的部分,存爲字符串data

       5   聲明一個key-value類型變量step_root,用於存儲整個模型信息

    (下面開始處理header部分)

  6   聲明一個key-value類型變量header_root,用於存儲header部分的結構化信息

  7   將header字符串按照 行 \n進行切分 header.split("\n") , 將全部行存爲一個數組(ArrayList) header_list, 每一個元素是一行

  8   for line in header_list:    (對header中的每一行字符串line, 作以下操做)

  9     對字符串line,搜索第一個左括號(, 將第一個左括號( 左側的英文串做爲key, 

  10     包含該左括號一直到最右側分號以前的右括號)爲止的字符串做爲value

  11   將key value 添加到header_root中

  12   將"header"做爲key, header_root做爲value, 添加到step_root中

    (下面是對data部分處理)

  13  聲明一個key-value類型變量data_root 用於存儲data部分的結構化數據

  14  將data按照一行\n進行切分 data.split("\n"), 並存入一個數組(ArrayList) data_list, 每一個元素是一行

  15  聲明一個key-value類型變量 data_lines 用於映射實體 每一行的編號(實體表示) 和 對應屬性

  16  for line in data_list:   (對於data中的每一行作以下操做:) 

  17    對line按照 = 進行切分, 左側 #數字 做爲key, 右側去掉; 做爲value

  18    將key value 添加到data_lines 當中

  19   while data_lines 不爲空:  

  20    從data_lines中取出最早添加進來的鍵值對num-line,並在data_lines中刪除這個鍵值對

  21    對line部分搜索第一個左括號(,第一個左括號左側部分的英文串做爲key

  22       第一個左括號和最後一個右括號之間的字符串存爲臨時字符串tmp

  23          聲明一個可變類型數組list做爲value, 稍後將值加入list

  24     對tmp按照逗號,進行切分 tmp.split(",") 並把每一項存入list中

  25     for cur in list:  (拿出list的每一項cur進行檢查:)

  26     若是cur是能匹配成 #數字 的規則:

  27       調用子算法  構造子實體 算法, 將cur和data_lines傳入,拿到返回值res,

  28       將list中的cur位置替換爲res

  29     將key,value加入到data_root中

  30   將"data"做爲key, data_root做爲value,添加到step_root中

  31   將step_root轉換json字符串step_json

  32   返回step_root 並 打印輸出step_json

 

子算法: 構造子實體 算法(僞代碼流程):

輸入: 字符串cur, key-value類型 data_lines

輸出: key-value類型 res

  1   聲明一個key-value類型變量res

  2   在data_lines中用cur看成鍵來查找獲得值tmp

  3   從data_lines中刪除這對鍵值對cur-tmp

  4   對tmp搜索第一個出現左括號的位置,將第一個左括號左側的英文串當作key

  5   對tmp第一個左括號和最後一個右括號之間的字符串存爲line

  6   聲明一個可變類型列表ArrayList變量list做爲value,稍後加入元素

  7   對line按照逗號,切分  line.split(",") 並把每一項加入list中

  8   for s in list:  對list中的每一項作檢查:

  9     若是 s 能匹配 #數字 這種規則:

  10      調用 構造子實體算法,傳入s和data_lines, 拿到返回值res_tmp

  11      將list中s對應的位置替換成res_tmp

  12  將key,value添加到res當中

  13  返回res

 

 

附上一段python實現的demo

 

 1 def get_info(start, lines):
 2     res = {}
 3     tmp = lines[start]
 4     lines.pop(start)
 5     cut_position = tmp.find("(")
 6     k, v = tmp[:cut_position], tmp[cut_position+1:-2].split(",")
 7     for i, vv in enumerate(v):
 8         v[i] = vv.strip()
 9         if v[i].startswith("#"):
10             v[i] = get_info(v[i], lines)
11     res[k] = v
12     return res
13 
14 if __name__ == '__main__':
15     s = """
16 #1 = aa('',12,45,#2);
17 #2 = bb('',55, #3,33);
18 #3 = cc('', 234,jjj);
19 """
20     lines = {}  # 存放 #num 和右側的映射關係
21     s = s.strip().split("\n")
22     for tmp in s:
23         tmp = tmp.split("=")
24         k = tmp[0].strip()
25         v = tmp[1].strip()
26         lines[k] = v
27     res = get_info("#1", lines)
28     print(res)

 

運行結果:

{'aa': ["''", '12', '45', {'bb': ["''", '55', {'cc': ["''", '234', 'jjj']}, '33']}]}

相關文章
相關標籤/搜索