首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用textscan读取数据块

使用textscan读取数据块
EN

Stack Overflow用户
提问于 2012-07-09 06:20:04
回答 3查看 1.3K关注 0票数 0

如何提取每个月的“均值”和“深度”数据?

代码语言:javascript
复制
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 

它在数据之间有无法定义的空格数量,并且在开头有一个导言行。

谢谢!

EN

回答 3

Stack Overflow用户

发布于 2012-07-09 13:29:26

下面是如何从文件中读取行的示例:

代码语言:javascript
复制
fid = fopen('yourfile.txt');

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

fclose(fid);

在while循环中,您需要使用strtok (或类似的东西)将每一行分割成以空格分隔的字符串标记。

票数 0
EN

Stack Overflow用户

发布于 2012-07-27 00:08:48

Matlab的regexp对于从结构较少的文本中提取数据非常强大。通常情况下,熟悉正则表达式是非常值得的: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+)组成:

因此,将这些放在一起,您的捕获模式将如下所示(括号包含要捕获的数据模式):

代码语言:javascript
复制
expr = '\s{6}(\d+\.\d+)\s+(\d+\.\d+)\s+(\d+)';

我们可以通过添加“?”为每个令牌(即要在组中捕获的每个数据点)添加名称。在括号内:

代码语言:javascript
复制
expr = '\s{6}(?<mean>\d+\.\d+)\s+(?<sd>\d+\.\d+)\s+(?<obs>\d+)';

然后,只需将您的文件读取到一个字符串变量'strFile‘中,并使用以下定义的模式提取数据:

代码语言:javascript
复制
strFile = urlread('file://mydata.txt');
[tokens data] = regexp(strFile, expr, 'tokens', 'names');

变量'tokens‘将包含一系列观察组,’.mean‘是一个具有字段expr和.obs的结构(因为它们是’expr‘中的令牌名)。

票数 0
EN

Stack Overflow用户

发布于 2012-07-27 01:57:53

例如,如果您只想获取前两列,那么textscan()是一个很好的选择。

代码语言:javascript
复制
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也应该可以很好地工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11387194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档