2013-02-13 58 views
1

我有一些數據文件,我想加載到matlab中。不幸的是,他們有一個相當複雜的結構 - 至少與我習慣的相比。你應該可以在這裏下載一個老的例子https://www.dropbox.com/s/vbh6kl334c5zg1s/fn1_2.out(它可以在記事本或寫字板中打開)將一個非常複雜的結構導入到matlab中

它是基於同步加速器數據的數據文件,其中原始數據,規則化的「原始」數據和(間接)列出了傅里葉變換數據+擬合數據。還有一些來自傅里葉變換的統計數據。

我只需要引用我論文中的統計結果,所以儘管繪製一些結果會很好,但並不是絕對必要的。然而,我需要將原始的,正規化的數據與適合度以及傅里葉變換後的數據結合在一起。

我的問題

在數據文件中

,從統計分析的結果,我需要的數據之前,如圖。但統計分析中列的大小因數據文件而異。這意味着我不能只將統計信息包含在標題中,除非我手動更改每個導入的文件的標題行數。我需要一起分析5個數據文件組,我至少需要分析大約30個文件,所以我想盡可能避免它。今後我將再次需要加載這種數據文件 - 所以即使改變headerlines次數30次聽起來並不糟糕,這將是很好能夠做到自動

可能的解決方法

無論是他原始,正規化連同擬合數據以及進行傅里葉變換數據是由告訴我,在此之後和一個空/空行,該數據開始

,所以我雖然具體的行前也許我可以用正則表達式來告訴matlab到忽略一切,直到你看到這個特定的線路,忽略此行,多了一個,然後再導入數據

我用Google搜索,發現這個話題當使用正則表達式:Trying to parse a fairly complex text file

,但我是新來的正則表達式和代碼建議對我來說有點複雜。我可以收集他使用命名捕獲,但我不太清楚我明白他是如何使用它,如果我可以採用它給我需要。我檢查了官方的matlab文檔,但他們的例子比較簡單:)(http://www.mathworks.se/help/matlab/matlab_prog/regular-expressions.html#bqm94nz-1

對不起,寫了這麼長的文章。就如何處理這一問題進行的任何建議,將不勝感激

/馬丁

編輯

總部設在評論的鏈接我已經使用的代碼:

fileName = 'data.dat'; 
inputfile = fopen(fileName); 

% Ignore all until we see one that just consists of this: 
startString = '  R   P(R)  ERROR'; 

mydata = []; 

while 1 
tline = fgetl(inputfile); 

% Break if we hit end of file, or the start marker 
if ~ischar(tline) || strcmp(tline, startString) 
    break 
end 

data = sscanf(tline, '%f', 3); 
mydata(end+1,:) = data; 

end 
fclose(inputfile); 

當我運行代碼時出現錯誤:

Subscripted assignment dimension mismatch. 

mydata(end+1,:) = data; 

任何建議將大大appriciated和我的道歉奇怪的佈局/離開評論中的鏈接。我不允許在帖子中包含兩個以上的鏈接,而且我現在還不能添加新的答案 - 這是由於我不得不以低代表:)

+0

我發現這種方法忽略了一切,直到一個特定的行:[鏈接](http://wiki.stdout.org/matlabcookbook/File%20IO/Skipping%20lines%20while%20reading%20a%20text%20file/ )。我已經嘗試加入解決方案,代碼顯示在下一條評論 – 2013-02-13 12:52:47

回答

0

由於塊之間至少有兩條新線可以分開使用即將文本分成塊並分別進行分析。試試這個代碼

fileH = fopen('fn1_2.out'); 
content = fscanf(fileH, '%c', inf); 
fclose(fileH); 

splitstring = regexp(content, '\r\n\r\n', 'split'); 

blocks = regexp(splitstring, '\d\.\d{4}.*\r\n.*\d\.\d{4}','match'); 
numericBlocksIdx = find(cellfun(@(x) ~isempty(x), blocks)); 
numericBlocks = splitstring(numericBlocksIdx); 

現在numericBlocks{1}numericBlocks{2},...包含你感興趣的表。需要注意的是對於一些表中還包括了頭,因爲它們不是由兩條新線分離。從這裏您可以使用像textscan這樣的函數將數據讀入矩陣。

+0

太棒了!你的代碼工作得很漂亮:)感謝你的幫助。我開始使用textscan來提取讀取數據到矩陣 – 2013-02-13 19:16:24

+0

很高興它的工作。請注意,第二個正則表達式假定該表至少有兩行數字。如果不能假定你應該改變其他東西。 – 2013-02-14 08:19:15

+0

我曾嘗試使用textscan從不同的塊中讀取數據。但到目前爲止我還沒有成功。我得到的只是空單元結構。我有兩個截圖[link1](https://www.dropbox.com/s/gh4e3rdtnlptlt1/textscan_probs.png)和[link2](https://www.dropbox.com/s/t7s8z4rar697a50/textscan_probsII.png )。最後一條命令將名稱更改爲「numeasd」只是爲了確保問題不在於我拼錯了單元名稱。我希望我的問題不是太愚蠢:) – 2013-02-14 10:45:37