任務描述:給定一個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']}]}