2017-03-01 86 views
0

我有多個文本文件,只是想只提取符合條件的值,如何在matlab中用條件提取文本中的單詞?

文件看起來像這樣

157.76941498460488, u'id': 1056080, u'image_id': 354282, u'bbox':  [188.68243243243242, 229.17468354430378, 16.21621621621621, 9.729113924050637], u'legibility': u'illegible', u'class': u'machine printed'}, {u'language': u'na', u'area': 157.76941498460522, u'id': 1056081, u'image_id': 354282, u'bbox': [176.79054054054052, 241.06582278481014, 16.216216216216246, 9.729113924050637], u'legibility': u'illegible', u'class': u'machine printed'}, {u'language': u'na', u'area': 130.89018132056108, u'id': 1056082, u'image_id': 354282, u'bbox': [60.03378378378378, 224.8506329113924, 15.13513513513514, 8.648101265822783], u'legibility': u'illegible', u'class': u'machine printed'}, {u'language': u'english', u'area': 229.08553456429397, u'class': u'machine printed', u'utf8_string': u'7206', u'image_id': 354282, u'bbox': [447.84940154212785, 338.8799273943157, 15.489338584815993, 14.78988488177692], u'legibility': u'legible', u'id': 1232932}, {u'language': u'english', u'area': 125.41629858832702, u'class': u'machine printed', u'utf8_string': u'HSS', u'image_id': 354282, u'bbox': [465.63345695432395, 333.1362827800334, 10.039386119788142, 12.492427036063997], u'legibility': u'legible', u'id': 1232933}] 

我想提取所有bboxs如果utf8_string和輸出庫這樣

bbox = [188.68243243243242, 229.17468354430378, 16.21621621621621, 9.729113924050637] 
bbox1 = [60.03378378378378, 224.8506329113924, 15.13513513513514, 8.648101265822783] 
..etc bbox3 and box4 all the bboxs if its 'utf8_string'and legible 

我的代碼

i=imread('image.JPEG'); 

fid = fopen('text1.txt','r'); 
C = textscan(fid, '%s','Delimiter',''); 
fclose(fid); 
C = C{:}; 

box = ~cellfun(@isempty, strfind(C,'bbox')); 

output = [C{find(box)}] 

我得到的不僅是bbox的整條線。

+0

你爲什麼要指定一個空的分隔符? – excaza

回答

0

下面是使用正則表達式進行此提取的代碼示例。它可能不是世界上最快的,也不是最強大的,但如果你的文本文件很小,它就可以完成這項工作。它提供了一個關於如何在這種情況下繼續進行的想法,並修改了代碼,以便在必要時與您的數據完全協作。

我想你在[filepathList]

Cdata = cell(numel(filepathList),1); 
for i=1:numel(filepathList) 
    fid = fopen(filepathList{i}); 
    tline = fgetl(fid); 

    % find the bbox blocks 
    C = regexp(tline,'u''bbox'': +\[([0-9\. ,]+)\]','tokens'); 
    C = cellfun(@(x) x{1},C,'UniformOutput',false)'; 

    % in each block, find the numbers 
    C2 = cellfun(@(x) textscan(x,'%f','Whitespace',', '),C,'UniformOutput',false); 
    Cdata{i} = cell2mat(cellfun(@(x) x', cat(1,C2{:}),'UniformOutput',false)); 
    fclose(fid); 
end 

希望這有助於文件的列表!

+0

感謝您的快速回復和易於理解的代碼,它完美地運行在上面的示例中。但是,當我開始運行它與不同的文本它給了我一個錯誤'錯誤使用貓 矩陣的尺寸連接是不一致的' –

+0

我修改代碼,以便它與第二個例子 – beesleep

+0

感謝它很有用像魅力,我的最後一個問題是,如何推廣它,我有更多的10k這樣的文件,並嘗試在循環中運行它。感謝您的提前 –

相關問題