2012-07-11 122 views
3

我有一個分號分隔的格式如下文件:我該如何解析這個分號分隔的文件?

Press;Temp.;CondF;Cond20;O2%;O2ppm;pH;NO3;Chl(a);PhycoEr;PhycoCy;PAR;DATE;TIME;excel.date;date.time 
0.96;20.011;432.1;431.9;125.1;11.34;8.999;134;9.2;2.53;1.85;16.302;08.06.2011;12:01:52;40702;40702.0.5 
1;20.011;433;432.8;125;11.34;9;133.7;8.19;3.32;2.02;17.06;08.06.2011;12:01:54;40702;40702.0.5 
1.1;20.012;432.7;432.4;125.1;11.34;9;133.8;8.35;2.13;2.2;19.007;08.06.2011;12:01:55;40702;40702.0.5 
1.2;20.012;432.8;432.5;125.2;11.35;9.001;133.8;8.45;2.95;1.95;21.054;08.06.2011;12:01:56;40702;40702.0.5 
1.3;20.012;432.7;432.4;125.4;11.37;9.002;133.7;8.62;3.17;1.87;22.934;08.06.2011;12:01:57;40702;40702.0.5 
1.4;20.007;432.1;431.9;125.2;11.35;9.003;133.7;9.48;4.17;1.6;24.828;08.06.2011;12:01:58;40702;40702.0.5 

我怎麼能分析到這一點在MATLAB矩陣?我不關心第一行,但我想要矩陣中的其餘行。他們不需要轉換成雙打,矩陣可以由字符串組成。文件中有新行,代表行的末尾。新行之前沒有分號。

感謝您的幫助。

回答

1

晚上最大。

我打算假設您已經能夠從文件導入數據或以其他方式將其導入Matlab。我通常用這種數據的方法將它留在單元格的列矩陣中。然後每個單元格包含文件中的一行數據。

然後,您可以將單元格轉換爲字符矩陣,並使用regexp將該數據解析爲更易於使用的矩陣,並將頂部行作爲標題數據。

如果你被卡住了,只是發佈一些代碼,我們可以通過它。

乾杯!

更新:

下面是我說的代碼。

A = importdata('filepath\sample.txt') %This uses the newline on each line to make a new row. 
B= []; 
for(n = 1:size(A,1)) 
    B = [B;regexp(cell2mat(A(n)),';','split')]; %This uses the ; to split the string 
end 

Matlab索引始終以(行,列)格式完成。因此,像矩陣(2,3)這樣的東西會在第2行第3列的位置調用一個項目.MFC也總是從1開始索引,而不是像其他許多語言那樣索引。

如果您有單排或單列(通常稱爲向量),那麼您只需調用matrix(4)並返回第4個元素。如果你願意,你也可以有3個或更多的圖層。如果你願意,可以考慮矩陣矩陣。

當將可變長度數據存儲在單個位置時,單元格非常有用。當數據存儲在單元中時,它仍以與矩陣相同的方式調用,但您必須將其從單元類型轉換爲矩陣(cell2mat)以供某些用途使用。你會很快學會這些。還有其他方法可以從cell轉換,比如cell2num。

希望有助於更多!

+0

只是說明一下,這可能不是最好的做法,但不是我的頭頂,它應該讓你開始在路上。 – 2012-07-11 02:43:47

+0

我實際上是在尋找一些matlab代碼。我可以在許多其他語言中解決這個問題,但是我發現編寫matlab代碼非常困難。我現在正在做的研究是我對matlab的第一次經歷。什麼是單元列矩陣(什麼是單元?)的語法,以及如何實際使用正則表達式。在我看來,matlab的文檔過於冗長,從來沒有闡明解決常見問題的正確方法。感謝您的幫助。 – Max 2012-07-11 02:57:32

+0

更新了一個簡短的例子和一些額外的信息給你。 – 2012-07-11 11:54:16

2

你可以使用textscan來做到這一點。

fid = fopen('data.txt'); %open file 
headers = fgetl(fid); %get first line 
headers = textscan(headers,'%s','delimiter',';'); %read first line 
format = repmat('%s',1,size(headers{1,1},1)); %count columns and make format string 
data = textscan(fid,format,'delimiter',';'); %read rest of the file 
data = [data{:}]; 
3

考慮以下代碼讀取數據:

fid = fopen('file.txt','rt'); 
frmt = [repmat('%f ',1,12) '%s %s %f %s']; 
C = textscan(fid, frmt, 'Delimiter',';', 'CollectOutput',true, 'HeaderLines',1); 
fclose(fid); 

首先我們先讀入變量C的不同組成部分:第一個12列數字,接下來的兩成字符串(我們將其轉換爲在下一步的序列日期數字),另一個數值列,最後一個字符串之一:

>> C 
C = 
    [6x12 double] {6x2 cell} [6x1 double] {6x1 cell} 

正如我提到的,我們可以分析和隱蔽C{2}變成序列日期:

dt = datenum(strcat(C{2}(:,1),{' '},C{2}(:,2)), 'dd.mm.yyyy HH:MM:ss'); 

現在我們可以將它們全部合併到一個單元格數組中作爲表格。我們使用單元格數組而不是數字矩陣,因爲最後一列仍然是字符串。

>> data = [num2cell([C{1} dt C{3}]) C{4}] 

data = 
    Columns 1 through 7 
    [0.96] [20.011] [432.1] [431.9] [125.1] [11.34] [8.999] 
    [ 1] [20.011] [ 433] [432.8] [ 125] [11.34] [ 9] 
    [ 1.1] [20.012] [432.7] [432.4] [125.1] [11.34] [ 9] 
    [ 1.2] [20.012] [432.8] [432.5] [125.2] [11.35] [9.001] 
    [ 1.3] [20.012] [432.7] [432.4] [125.4] [11.37] [9.002] 
    [ 1.4] [20.007] [432.1] [431.9] [125.2] [11.35] [9.003] 
    Columns 8 through 14 
    [ 134] [ 9.2] [2.53] [1.85] [16.302] [7.3466e+05] [40702] 
    [133.7] [8.19] [3.32] [2.02] [ 17.06] [7.3466e+05] [40702] 
    [133.8] [8.35] [2.13] [ 2.2] [19.007] [7.3466e+05] [40702] 
    [133.8] [8.45] [2.95] [1.95] [21.054] [7.3466e+05] [40702] 
    [133.7] [8.62] [3.17] [1.87] [22.934] [7.3466e+05] [40702] 
    [133.7] [9.48] [4.17] [ 1.6] [24.828] [7.3466e+05] [40702] 
    Column 15 
    '40702.0.5' 
    '40702.0.5' 
    '40702.0.5' 
    '40702.0.5' 
    '40702.0.5' 
    '40702.0.5'