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

将结构非常复杂的数据导入matlab,matlab,import,Matlab,Import,我有一些数据文件,我想加载到matlab。不幸的是,他们有一个相当复杂的结构-至少与我所习惯的相比。你应该可以在这里下载一个旧的例子,它可以在记事本或写字板上打开 它是基于同步加速器数据的数据文件,其中列出了原始数据、正则化原始数据和间接傅里叶变换数据+拟合数据。此外,还有一些来自傅里叶变换的统计数据 我只需要在我的论文中引用统计数据的结果,所以虽然绘制一些结果会很好,但这并不是严格必要的。然而,我需要原始数据、正则化数据、拟合数据和傅里叶变换数据 我的问题 在数据文件中,统计分析的结果显示在我

我有一些数据文件,我想加载到matlab。不幸的是,他们有一个相当复杂的结构-至少与我所习惯的相比。你应该可以在这里下载一个旧的例子,它可以在记事本或写字板上打开

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

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

我的问题

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

可能的解决办法

原始数据和正则化数据以及拟合以及傅里叶变换数据前面都有一行,这行告诉我,在这行和一条空行之后,数据开始

所以我想也许我可以用正则表达式告诉matlab忽略一切,直到你看到这一行,忽略这一行和另一行,然后导入数据

我在谷歌上搜索并找到了使用正则表达式的主题:

但是我不熟悉正则表达式,建议的代码对我来说有点复杂。我可以推测他使用命名捕获,但我不太确定我是否理解他如何使用它,以及我是否可以根据需要采用它。我已经查阅了matlab官方文档,但它们的示例稍微简单一些:

很抱歉写了这么长的帖子。对于如何处理这个问题的任何建议都将不胜感激

/马丁

编辑

我使用的代码基于注释中的链接:

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;

如果您有任何建议,我们将不胜感激,我对您的奇怪布局/在评论中留下链接表示歉意。我不允许在一篇文章中包含两个以上的链接,我还不能添加新的答案-这两个原因都是因为我必须降低重复率:

,因为块之间至少有两行新行分隔,所以您可以使用这两行新行将文本分隔成块并单独分析它们。试试这个代码

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);

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

我发现这种方法可以忽略所有内容,直到指定一行:。我已经尝试合并该解决方案,代码将在下一篇评论中显示!你的代码运行得很好:谢谢你的帮助。我开始使用textscan提取数据,并将数据读取到矩阵中。很高兴它起了作用。请注意,第二个正则表达式假定表中至少有两行数字。如果这不能被假定,你应该把它改成其他的东西。我已经试着用textscan从不同的块中读取数据。但到目前为止我还没有成功。我得到的只是空的细胞结构。我有两个截图和。我将名称更改为numeasd的最后一个命令只是为了确保问题不是因为我拼错了单元格名称。我希望我的问题不是太愚蠢:使用textscannumericBlocks{1,4}、%f';将在读取数据的情况下实际工作。但它存储在一个仅在一个数组中。这意味着x值存储在索引1:3:301、y值2:3:302和标准错误3:3:303上,所以我只需要找到一种方法,将数据从特定索引提取到一个新数组中-我正在研究这个问题,现在您可以使用textscannumericBlocks{1,4},'%f%f%f';相反然后将对列进行分组。请看一下textscan文档中的示例。