1

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

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

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

我的问题

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

可能的解决方案

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

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

我用谷歌搜索并找到了使用正则表达式的主题:尝试解析一个相当复杂的文本文件

但我是正则表达式的新手,建议的代码对我来说有点复杂。我可以推测他使用了命名捕获,但我不太确定我是否了解他如何使用它,以及我是否可以根据需要采用它。我检查了官方的 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;

任何建议都会受到极大的欢迎,我对奇怪的布局/在评论中留下链接表示歉意。我不允许在帖子中包含两个以上的链接,而且我还不能添加新的答案——这都是因为我的代表人数太少了 :)

4

1 回答 1

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之类的函数将数据读入矩阵。

于 2013-02-13T18:08:46.937 回答