如何提取每个月的“均值”和“深度”数据?
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 它在数据之间有无法定义的空格数量,并且在开头有一个导言行。
谢谢!
发布于 2012-07-09 13:29:26
下面是如何从文件中读取行的示例:
fid = fopen('yourfile.txt');
tline = fgetl(fid);
while ischar(tline)
disp(tline)
tline = fgetl(fid);
end
fclose(fid);在while循环中,您需要使用strtok (或类似的东西)将每一行分割成以空格分隔的字符串标记。
发布于 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+)组成:
因此,将这些放在一起,您的捕获模式将如下所示(括号包含要捕获的数据模式):
expr = '\s{6}(\d+\.\d+)\s+(\d+\.\d+)\s+(\d+)';我们可以通过添加“?”为每个令牌(即要在组中捕获的每个数据点)添加名称。在括号内:
expr = '\s{6}(?<mean>\d+\.\d+)\s+(?<sd>\d+\.\d+)\s+(?<obs>\d+)';然后,只需将您的文件读取到一个字符串变量'strFile‘中,并使用以下定义的模式提取数据:
strFile = urlread('file://mydata.txt');
[tokens data] = regexp(strFile, expr, 'tokens', 'names');变量'tokens‘将包含一系列观察组,’.mean‘是一个具有字段expr和.obs的结构(因为它们是’expr‘中的令牌名)。
发布于 2012-07-27 01:57:53
例如,如果您只想获取前两列,那么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也应该可以很好地工作。
https://stackoverflow.com/questions/11387194
复制相似问题