Matlab:从一个文本文件导入多个数据集

时间:2012-09-19 21:29:52

标签: matlab import octave

所以我有一个脚本可以在不同的环境中为我解析一些数据,并且我将这些数据输出到文件中,我稍后会读到MATLAB。但是,如果我将10个数据集写入同一个文件(理想情况),MATLAB将只读取第一个数据集。理想情况下,我想读取包含结果的结构的单元格数组。进口。我对如何输出文件有一些余地,但基本上它必须是简单的,我可以一次写一行。

不幸的是,将附加数据集附加为列非常困难。以下是一些示例数据的示例:

DataSet1
x   y   z
3.82724 60.8234 13.0031
3.79987 60.909  -8.89291
3.75338 60.9124 19.5031
3.67715 61.0104 -24.5894
3.68124 61.0889 -20.8511
3.88438 61.1817 34.891
3.71405 61.2379 16.31
3.85504 61.245  -19.3778
4.09736 68.85   5.86954
3.39505 69.9457 64.8669
3.36033 69.9552 -58.8838
3.39427 70.9253 -26.0232
3.35769 70.9523 18.7863

DataSet2
x   y   z
3.73244 60.597  -21.6651
3.81217 60.712  -29.5505
3.74396 60.7554 -43.6225
3.70079 60.8271 -69.0996
3.87417 60.8662 -49.8068
3.74371 61.6553 34.915
3.815   61.7063 28.5842
3.88035 61.802  78.4314

理想情况下,我想保留这种结构。我看到的最好的替代方法是写入大量不同的文件(不理想),或者将其写入一个长数组,然后在那里有一些标题信息,指示每个数据集的起始位置。再次,不是一个理想的情况。有没有办法使用类似于importdata()的东西?

3 个答案:

答案 0 :(得分:3)

您可以使用文本扫描。它非常灵活,所以我相信你可以根据你的情况进行调整。以下是示例数据集的代码:

C = textscan(fd, '%f%f%f', 'TreatAsEmpty', {'x y z', 'Dataset1', 'Dataset2'});

C是具有双值的3个列向量的单元格,每个%f一个。

>> C{1}

ans =

   NaN
   NaN
3.8272
3.7999
3.7534
....

如您所见,您将在有数据集分隔符的位置获得NaN,因此您可以轻松地拆分数据集。必须将'字符串'数据集分隔符显式指定为TreatAsEmpty参数(我在此处更改了'x y z'字符串以在字符之间包含一个空格)。

答案 1 :(得分:1)

Matlab附带的所有文本读取/导入例程假设每个文件有1个数据集。可能有一些标题行或一些随机缺失值或空行,但这是因为它们的灵活性。

如果要导入这些数据集,则必须编写自己的例程,在循环中使用fgetl,解释并解析每个单独的行并将其附加到(可能是新的)单元格数组中。

问题变成了:你花在编写那个例程的时间是否值得摆脱多个文件的“丑陋”,每个数据集1个?

答案 2 :(得分:0)

如果可以的话,我会鼓励你摆脱基于文本的数据的束缚。

如果您使用Matlab生成数据,那么您有一些简单的选择。例如,您可以使用带有save标志的-append命令将变量添加到文件中。

save('someFileName.mat', 'Dataset1');  %Create a file with one variable
% ... do more work
save('someFileName.mat', 'Dataset1', '-append');  %Add another variable to the dataset

你也可以(截至2012a)使用matfile类来操纵个别变量,例如

interfaceToFile = matfile('someFileName.mat','writable',true);
interfaceToFile.datasets = cell(100,1);
interfaceToFile.datasets(1,1) = {dataset1}; 
interfaceToFile.datasets(2,1) = {dataset2}; 

如果您使用其他方法生成数据,我会调查HDF5格式。它被开发用于C和Fortran程序,并且具有高效的Matlab接口,以及许多其他语言的实现。

如果您需要文字,那么其他答案之一就足够了。