2012-08-16 77 views
0

我有多個文本文件,每個文件都是仿真結果。該文件的內容是如下:試圖解析一個相當複雜的文本文件

Parameter_1 = value 
Parameter_2 = value 
..... 

Test 1 
Min: value 
Max: value 
Average: value 

Test 2 
Min: value 
Max: value 
Average: value 

每個文件包含相同類型的具有不同值的參數,當然測試值是不同的。

我需要能夠將這些數據導入到Matlab。我想在Matlab中做的是能夠創建參數圖(x軸)和測試結果。例如,Parameter_1更改時Test 1 Min值的圖表表示選擇n個文件,其中只有Parameter_1不同,並比較Test 1 Min結果。

這裏是我的問題:我應該如何在我的文本文件中組織這些數據,以便於導入到Matlab?我是Matlab新手,所以我不知道最好的方法是什麼。

任何可以幫助我開始的想法都會很棒。謝謝!

+0

文本文件之間的變化是什麼?更具體地說,所有文件都具有相同數量的'Parameter_N's?他們都具有相同數量的「測試」嗎?所有測試只有3個值'Min','Max','Average'? – slayton 2012-08-16 13:45:18

+0

不同的文件具有不同的參數值和不同的測試值。我編輯了我的問題。 – Yotam 2012-08-16 13:50:19

+0

你可以嘗試一個excel或csv文件 – Gir 2012-08-16 13:51:07

回答

2

「組織數據的最佳方式」是一個非常有爭議的問題。如果你問10個人,你會得到11個不同的答案。它通常取決於您可用於導入和導出數據的數據和功能。這就是說,Matlab擅長(哈,沒有雙關語意圖)在導入純數字數據。如果您可以將文件組織爲僅由數字組成,則快速「加載」,「dlmread」或「csvread」命令將導入它們。包括文本數據使事情變得更加複雜一些。

例如,如果你的文件是非常一致的,你可以組織這些文件是這樣的:

Param1Value,Param2Value,Param3Value 
1,Test1min,test1max,test1average 
2,Test2min,test2max,test2average 

凡在本示例中,所有的文本都只是數值(整數或浮點數),那將是非常容易導入到Matlab中。你會知道第一行包含你的參數值

data = csvread('input.csv'); 
params = data(1,:); 

你可以快速拉出測試數字,最小值,最大值和平均值。

tests = data(2:end,1); 
mins = data(2:end,2); 
maxs = data(2:end,3); 
avgs = data(2:end,4); 

但是,這一切都取決於您在輸出端的靈活性。

+0

文本可以更容易地告訴一個數字代表什麼參數。此外,我還有許多來自不同模擬的不同文本文件。這不是一團糟嗎?我會記住你的建議 – Yotam 2012-08-16 13:53:04

+0

那麼,輸出格式是我決定:) – Yotam 2012-08-16 13:55:12

3

你的文件沒有什麼根本性的錯誤。你將需要編寫一個解析器。但是,不要害怕這不是太難。

正則表達式對此非常有用。我需要一點點閱讀才能掌握它 - 但它是令人難以置信的強大。

我會用這樣的代碼:

fid = fopen('myfile.txt'); 
result = {}; 
result_entry=[]; 
while 1 
    tline = fgetl(fid); 
    if ~ischar(tline), break, end 

    r = regexp(tline,'^(?<key>\w+)\W*=\W*(?<value>.*?)\W*$','names'); 
    if ~isempty(r) 
    parameter_list.(r.key) = r.value; 
    continue 
    end 

    % does a new entry start? 
    r = regexp(tline,'^Test\W+(?<num>\d+)\W*$','names'); 
    if ~isempty(r) 
     result = [result,{result_entry}]; 
     result_entry = struct('TestNumber',r.num); 
     continue 
    end 

    r = regexp(tline,'^(?<key>\w+)\W*:\W*(?<value>.*?)\W*$','names'); 
    if ~isempty(r) 
     result_entry.(r.key) = r.value; 
    end 
end 
fclose(fid); 
+0

謝謝,這是很多努力在你身邊:)我知道正則表達式 - 我只是新來的Matlab。我使用Python並可以決定輸出格式 - 我的問題是什麼是一個好的格式?謝謝! – Yotam 2012-08-16 14:05:35

+0

那麼,從我的經驗來看,大多數基於文本的格式都很好。除非您通過Java,否則內置的XML和hdf5工具執行得非常糟糕。 – bdecaf 2012-08-16 18:48:08

0

只是一個想法 - 類似於JSON,你可以讓你保存爲有效MATLAB .m文件。這樣你就可以擁有matlab提供的所有結構特徵。