0

我是 MATLAB 编程的新手,有些语法让我无法理解。所以我需要一点帮助。另外我需要一些复杂的循环想法。

这是我所拥有的细分

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

这是我需要做的

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

暗示什么

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

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

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

4

2 回答 2

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

请记住,如果您不解析这些行,这将花费更长的时间。

希望这可以帮助。

于 2013-03-06T22:51:03.557 回答
1

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

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

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

matObj1.varName = matObj2.varName

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

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

只是一个免责声明:没有尝试过,使用风险自负。

于 2013-03-06T22:54:17.933 回答