【问题标题】:Looping to read in large data files循环读取大数据文件
【发布时间】:2015-11-04 17:45:17
【问题描述】:

我知道,关于这个话题已经有很多问题被问到了。不知何故,我错过了一些给我错误结果的东西。所以有人可以告诉我哪里出错了。

我在同一个目录中有一批大的.txtfiles (500 MB - 900MB),序列号是这样的。

EXPORT.001.txt,EXPORT.002.txt,EXPORT.003.txt,...... EXPORT.032.txt

我想读取每个文件并按顺序存储变量。

我的代码是

 files = dir('*.txt');
    for file = files'
 [time.file.name,Y_bt.file.name,Y_bc.file.name,X_bt.file.name,X_bc.file.name,X_C.file.name,Y_C.file.name,N_ot_an.file.name,N_ot_dig.file.name,n.file.name,n2.file.name] = import_file(file.name,startRow);
end

import_file 是我为读取每个文件而创建的另一个函数。

function [Time,Y_bt,Y_bc,X_bt,X_bc,X_C,Y_C,N_ot_an,N_ot_dig,n,n2] = import_file(filename,startRow)

delimiter = {'\t',' '};
formatSpec = '%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f';
fileID = fopen(filename,'r');
dataArray = textscan(fileID,formatSPec,'Delimiter','MultipleDelimsAsOne',true'EmptyValue',NaN,'HeaderLines',startRow-1,'ReturnOnError',false);

EXPORT = [dataArray{1:end}];
%Defining Individual channels

Time = EXPORT(:,2);
.
.
.
.
n2 = EXPORT(:,21);
fclose(fileID);

clear file ID;

当我运行程序时,我只从最后一个文本文件EXPORT.032.txt 中获取数据,其余的文件没有被读取。

我想要对我的程序做的只是为所有 .txt 文件中的所有变量创建一个结构数组。例如Time.file.name 应该创建一个名为Time 的结构,并包含所有数据集中的所有时间变量。我想使用这些数据结构将不同的变量调用到我程序的同一个脚本中。

提前致谢。

【问题讨论】:

  • 如果我能提出一个建议,在你的函数调用中有这么多的输出变量是糟糕的编程习惯。考虑返回包含每个输出变量作为字段的单个结构。
  • 感谢您的回答。我尝试遵循建议并修改了我的函数import_file,它现在只提供一个输出作为struct 数组,其中包含所有通道变量。现在我遇到的问题是我得到了一个结构数组,其中大部分是空值。和预分配有关吗?

标签: matlab for-loop text-files


【解决方案1】:

每次循环迭代都会覆盖所有变量。

for ii = 1:10
    A = ii;
end

将导致 A 成为值为 10 的标量。

for ii = 1:10
    A(ii) = ii;
end

将导致 A 是一个范围从 1 到 10 的数组。

使用循环变量file 附加到您想要的每个结构上。您似乎有多个嵌套结构,我不确定您要将其存储在哪个结构中,但 time(file.name) 似乎正是您要查找的。​​p>

清理代码的一个好方法是将所有内容存储在函数中的 single 结构中,这样您就可以在脚本中调用单个结构作为输出,使其更具可读性且不易发生到错误。

【讨论】:

  • 感谢您的回答。我根据您的建议更新了我的问题,还有几个问题。
  • @PBCR 如果这个答案解决了你以前的问题,那么你应该问一个新问题,而不是改变它。
  • @IKavanagh。我很抱歉造成混乱。它并没有真正解决问题。我还有更多错误并试图澄清它们。或者,如果您认为我需要开始另一个问题,我可以这样做,但这只会导致创建此问题的修改克隆版本。
  • @PBCR 对我粗略的一瞥表明这可以解决您的原始问题(特别是问题的标题),前提是您正确实施它。您的新问题(编辑)似乎完全不同,可以对我提出新问题。我会回滚并提出一个新问题。
  • @IKavanagh 好吧,我把它从网格上取下来了 :) 我发布了另一个问题。可能你想看看这个。link 谢谢
猜你喜欢
  • 1970-01-01
  • 2014-06-17
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
  • 2012-03-16
  • 2017-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多