2012-07-08 94 views
0

如何提取像每月下面的「平均」和「深度」數據?使用textscan讀取數據塊

MEAN, S.D., NO. OF OBSERVATIONS 


         January    February  ...    
Depth  Mean S.D. #Obs  Mean S.D. #Obs  ... 
    0  32.92 0.43  9  32.95 0.32 21  
    10  32.92 0.43 14  33.06 0.37 48  
    20  32.88 0.46 10  33.06 0.37 50  
    30  32.90 0.51  9  33.12 0.35 48  
    50  33.05 0.54  6  33.20 0.42 41  
    75  33.70 1.11  7  33.53 0.67 37  
    100  34.77   1  34.47 0.42 10  
    150                       
    200 

         July     August    
Depth  Mean S.D. #Obs  Mean S.D. #Obs  
    0  32.76 0.45 18  32.75 0.80 73  
    10  32.76 0.40 23  32.65 0.92 130  
    20  32.98 0.53 24  32.84 0.84 121  
    30  32.99 0.50 24  32.93 0.59 120  
    50  33.21 0.48 16  33.05 0.47 109  
    75  33.70 0.77 10  33.41 0.73 80  
    100  34.72 0.54  3  34.83 0.62 20  
    150        34.69   1              
    200 

它有數據之間的空間數量不確定的數量,並在開始介紹行。

謝謝!

回答

0

這裏是如何從文件中讀取行的例子:

fid = fopen('yourfile.txt'); 

tline = fgetl(fid); 
while ischar(tline) 
    disp(tline) 
    tline = fgetl(fid); 
end 

fclose(fid); 

在while循環中,您需要使用strtok(或類似的東西),每條線分解成由分隔字符串令牌空間。

0

Matlab的正則表達式對於從較少結構的文本中提取數據非常有用。它的真正價值越來越熟悉一般的正則表達式:http://www.mathworks.com/help/techdoc/ref/regexp.html

在這種情況下,您將定義捕捉每一個觀察組的模式(平均SD OBS),如:32.92 0.43 9

在這裏我看到一個模式對於每組數據:每個組前面有6個空格(正則表達式= \ s {6}),並且這3個數據點除以小於6個空格(\ s +)。數據本身由兩個浮點數(\ d +。\ d +)和一個整數(\ d +)組成:

因此,把它們放在一起,你的捕獲模式看起來就像這樣(括號括住要捕獲的數據模式):

expr = '\s{6}(\d+\.\d+)\s+(\d+\.\d+)\s+(\d+)'; 

我們可以通過添加'?'來爲每個標記添加名稱(即要在組中捕獲的每個數據點)括號內:

strFile = urlread('file://mydata.txt'); 
[tokens data] = regexp(strFile, expr, 'tokens', 'names'); 

變量「令牌」,那麼將包含序列:

expr = '\s{6}(?<mean>\d+\.\d+)\s+(?<sd>\d+\.\d+)\s+(?<obs>\d+)'; 

然後,就使用這種定義的圖案讀取您的文件分割成一個字符串變量「strFile」和提取數據觀察組和'數據'是一個帶有.mean .sd和.obs結構的結構(因爲這些是'expr'中的標記名稱)。

0

如果你只想得到,例如,前兩列,那麼textscan()是一個很好的選擇。

fid = fopen('yourfile.txt'); 

tline = fgetl(fid); 
while ischar(tline) 
    oneCell = textscan(tline, '%n'); % read the whole line, put it into a cell 
    allTheNums = oneCell{1}; % open up the cell to get at the columns 

    if isempty(allTheNums) % no numbers, header line 
     continue; 
    end 

    usefulNums = allTheNums(1:2) % get the first two columns 
end 

fclose(fid); 

textscan將自動把您給它那裏是空白的字符串,因此字符串列之間的不確定的數量不是問題。沒有數字的字符串會給出一個數組,您可以將其測試爲空以避免出現界限或數據錯誤。

如果您需要以編程方式確定要獲取哪些列,可以掃描單詞「Depth」和「Mean」以查找單元。正則表達式在這裏可能會有所幫助,但textscan也應該可以正常工作。