将具有非常复杂结构的数据导入matlab

时间:2013-02-13 10:46:35

标签: matlab import

我有一些数据文件,我想加载到matlab。不幸的是,它们的结构非常复杂 - 至少与我习惯的相比。你应该可以在这里下载一个旧的例子,https://www.dropbox.com/s/vbh6kl334c5zg1s/fn1_2.out(它在记事本或字盘中打开很好)

它是基于同步加速器数据的数据文件,其中列出了原始数据,正则化“原始”数据和(间接)傅里叶变换数据+适合数据。傅立叶变换还有一些统计数据。

我只需要引用我论文中统计数据的结果,因此虽然绘制一些结果会很好,但并不是绝对必要的。然而,我需要原始和正则化数据以及拟合和傅立叶变换数据。

我的问题

在数据文件中,统计分析的结果显示在我需要的数据之前。但统计分析中列的大小因数据文件而异。这意味着我不能只在标题中包含统计信息,除非我手动更改导入的每个文件的标题行数。我需要分析5个数据文件的组合,这次我至少需要分析大约30个文件,所以我想尽可能避免它。在未来我将再次需要加载这种数据文件 - 所以即使更改标题行数30次并不是很糟糕,能够自动执行它会很好

可能的解决方案

原始数据和正则化数据以及拟合数据和傅立叶变换数据之前都有一条特定的行,告诉我在此之后和空行/空行,数据开始

所以我虽然也许我可以使用正则表达式告诉matlab 忽略所有内容,直到你看到这个特定的行,忽略这一行和另外一行,然后导入数据

我用Google搜索并找到了使用正则表达式的主题:Trying to parse a fairly complex text file

但我是正则表达式的新手,建议的代码对我来说有点复杂。我可以收集他使用名为capture 但我不太确定我理解他是如何使用它的,以及我是否可以采用它来满足我的需要。我已经检查了官方的matlab文档,但他们的例子有点简单:)(http://www.mathworks.se/help/matlab/matlab_prog/regular-expressions.html#bqm94nz-1

很抱歉写了这么长的帖子。任何有关如何处理此问题的建议将不胜感激

/马丁

编辑

我根据评论中的链接使用的代码:

fileName = 'data.dat';
inputfile = fopen(fileName);

% Ignore all until we see one that just consists of this:
startString = '       R          P(R)      ERROR';

mydata = [];

while 1
 tline = fgetl(inputfile);

 % Break if we hit end of file, or the start marker
 if ~ischar(tline)  ||  strcmp(tline, startString)
    break
 end

 data = sscanf(tline, '%f', 3 );
 mydata(end+1,:) = data;

end
fclose(inputfile); 

当我运行代码时,我收到错误:

 Subscripted assignment dimension mismatch.

 mydata(end+1,:) = data;

任何建议都会受到极大的欢迎,我为奇怪的布局道歉/在评论中留下链接。我不允许在帖子中包含两个以上的链接,但我无法添加新的答案 - 这都是由于我不得不低代表:)

1 个答案:

答案 0 :(得分:0)

由于块由至少两个新行分隔,您可以使用它将文本分成块并单独分析它们。试试这段代码

fileH = fopen('fn1_2.out');
content = fscanf(fileH, '%c', inf);
fclose(fileH);

splitstring = regexp(content, '\r\n\r\n', 'split');

blocks = regexp(splitstring, '\d\.\d{4}.*\r\n.*\d\.\d{4}','match');
numericBlocksIdx = find(cellfun(@(x) ~isempty(x), blocks));
numericBlocks = splitstring(numericBlocksIdx);

现在numericBlocks{1}numericBlocks{2},...包含您感兴趣的表。请注意,对于某些表,还包括标题,因为它们没有两个新行分隔。从这里,您可以使用textscan等函数将数据读入矩阵。