2012-07-08 96 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也应该可以正常工作。