MATLAB - 拼接多个文件

时间:2013-03-06 22:20:55

标签: matlab

我是MATLAB编程的新手,一些语法让我感到厌烦。所以我需要一些帮助。另外,我需要一些复杂的循环思路。

以下是我的内容细分

  • 12个单独的.dat个文件,每个文件的标题都是output_1_x.datoutput_2_x.dat等。
  • 每个文件实际上是分离和处理的整体的一部分
  • 每个.dat文件大约是。 3.9 GB

以下是我需要做的事情

  • 创建一个包含每个单独文件中所有数据的文件,即我需要重新创建原始文件。
  • 将此完整输出文件称为output_final.dat
  • 必须在MATLAB中完成,没有其他选择(实际上可能有;请参阅下面的注释)

含义是什么

  • 我必须将每个3.9 GB文件fread分成块或数据包,一次可能100 MB(使用嵌入式循环?)
  • 必须读取这些数据包然后按顺序写入
  • 读取一个文件后写入output_final.dat,下一个文件自动读取&写(主循环)。

嗯,这就是它。我搜索了“合并多个文件”并找到了this。这不是我需要做的......我不需要从文件中获取文件或数据,并将其写入新文件。我只是...连接...?这在Java或Perl中很简单,但我只使用MATLAB作为工具。

注意:我在一个非常强大的盒子上运行OpenSUSE中的KDE。也许某个同时也是终端专家的人知道从内核执行此操作的命令/脚本?

2 个答案:

答案 0 :(得分:1)

所以在这个网站上我们通常会指向whathaveyoutried.com,但这个问题很好。

我不会写代码,但我会告诉你我会怎么做。所以首先我对你为什么需要fread文件感到有点困惑。你只是将一个文件附加到另一个文件的末尾吗?

您实际上可以使用unix命令来实现您的目标:

files = dir('*.dat');
for i = 1:length(files)
    string = sprintf('cat %s >> output_final.dat.temp', files(i).name);
    unix(string);
end

该代码应循环遍历所有文件并将所有内容传递到output_final.dat.temp(然后重命名,我们不希望它包含在任何内容中);

但是如果你真的想使用fread,因为你想以某种方式解析这些行,那么你可以使用相同的过程:

files = dir('*.dat');
fidF = fopen('output_final.dat', 'w');
for i = 1:length(files)
    fid = fopen(files(i).name);
    while(~feof(fid))
        string = fgetl(fid) %You may choose to parse the string in some manner here
        fprintf(fidF, '%s', string)
    end
end

请记住,如果你没有解析这些行,这将需要更长的时间。

希望这会有所帮助。

答案 1 :(得分:1)

我建议在两个文件中使用matlab.io.matfileclass个对象:

matObj1 = matfile('datafile1.mat')
matObj2 = matfile('datafile2.mat')

这不会将任何数据加载到内存中。然后,您可以使用对象的方法将变量从一个文件顺序保存到另一个文件。

matObj1.varName = matObj2.varName

您可以使用fieldnames(mathObj1)将所有变量放在一个文件中,然后循环将内容从一个文件复制到另一个文件。然后,您可以通过删除复制的字段来清除一些空间。或者您可以通过直接移动数据来使用更危险的程序:

matObj1.varName = rmfield(matObj2,'varName')

只是免责声明:没有尝试过,请自担风险使用。