【问题标题】:Importing matrix with different row length导入不同行长的矩阵
【发布时间】:2015-07-23 09:49:45
【问题描述】:

我有大型数据文件,我想导入 12 列数据以供进一步使用。但是,每个实例的行长度会有所不同。我只会导入选定的列,但在我需要的数据下方是一些空白行,后面是不必要的额外数字,所以我想知道如何只导入我需要的数据?我不介意指定和结束行,但这对于每种情况都会有所不同,我不确定我是否遗漏了任何其他明显的东西!为了帮助我附上了我正在使用的数据示例的打印屏幕:

总而言之,我只需要紫色框上方的“蓝色”数据,我将使用的每个文件都有相同的布局,除了可能有更多/更少的数据行。

【问题讨论】:

  • 你试过[xlsread('filename.xls','C9697:N9705') ; xlsread('filename.xls','C9716:N9720')]
  • 嗨,@Nishant 感谢您回复我!我想我已经使用导入工具完成了这项工作,但这不适用于每个具有不同数量“有用”行的文件。我想我想要有一种方法让它自动停止在以 Joints 开头的行之后导入任何值,如果这有意义的话?
  • 由于文件很大,我建议您退回到逐行读取文件并连接所需的行。
  • @Nishant 无论如何我都可以使用导入工具并指定我认为的结束行吗?由于我将拥有大量数据文件,因此我希望使用循环自动找到端点?

标签: matlab matrix import large-data


【解决方案1】:

编辑 我已经更新了代码,以便您更好地理解该过程:

% An empty array:
importedarray = [];
% Open the data file to read from it:
fid = fopen( 'dummydata.txt', 'r' );
% Check that fid is not -1 (error openning the file).
% read each line of the data in a cell array:
cac = textscan( fid, '%s', 'Delimiter', '\n' );
% size(cac{1},1) must equals the # of rows in your data file.
totalRows = size(cac{1},1);
fprintf('Imported %d rows of data!\n',totalRows)
% Close the file as we don't need it anymore:
fclose( fid );

% for total rows in data
for k=1:totalRows
    fprintf('Parsing data on row %d of %d...\n',k,totalRows);
    currentRow = cac{1}{k,1};
    fprintf('Row contains:\n%s\n',currentRow);
    % finish (break from loop) when encounter an empty row:
    if isempty(currentRow)
        fprintf('Empty row encountered (#%d). Exiting the loop...\n',k);
        break;
    end

    eachRowElement = strsplit(currentRow, ' ');
    fprintf('Splitting row to %d elements...\n',length(eachRowElement));
    fprintf('Converting row to floats...');
    eachRowElement2num = cellfun(@str2num,eachRowElement,'UniformOutput',false);
    fprintf('Done!\n');

    fprintf('Converting cell to matrix...');
    importedarray(k,:) = cell2mat(eachRowElement2num);
    fprintf('Done!\n');
end
clearvars cac k fid totalRows currentRow eachRowElement eachRowElement2num;

鉴于您的示例图像(每行的所有列都填充有浮点数,并且在您停止的空行上),这应该可以完成提供信息的工作。如果不是,您将能够通过查看代码停止的行来判断问题所在。我包含代码以在导入后消除不必要的变量。这必须手动完成,或者您可以创建一个函数来执行任务(函数的工作空间不同,临时变量在函数返回时被删除,请参阅:http://www.mathworks.com/help/matlab/ref/function.html)。希望这会有所帮助。

PS。在您的示例中,您保留 12 列跳过前两列。上面的代码将导入整行。您可以使用矩阵索引来选择以后要保留的列,例如:

importedarray = 导入数组(:,3:14);

如果这些列没有改变,您可以将其合并到您的函数中。

【讨论】:

  • 嗨,非常感谢@stefanos。这绝不是您的反映,但是当我尝试您的代码时,它说“索引超出了矩阵尺寸”。而且我是 Matlab 的新手,所以我确信我做错了什么。此外,我不确定这在我的 OP 中是否清楚,但我不需要紫色单元格向下的任何数字。最后,工作区中出现了诸如 totalColumns 和 cac 之类的内容,所以也许我需要在事物周围加上撇号?很抱歉我在这里缺乏知识!
  • @CPG1711 我已经更新了代码。请花点时间逐步完成它,让我知道它是否有效,如果无效,这似乎是问题所在。
  • 再次感谢您!我认为我们越来越近了,因为没有错误,但我看不到数据的原因是我确定我丢失了,当我使用我需要的文件运行它时,它会出现:“导入了 11666 行数据!解析 11666 的第 1 行上的数据...行包含:遇到空行 (#1)。退出循环..." 然后在工作区中,它的 ans 值为 0,importedarray 值为 []如果它有助于我将使用的表格顶部看起来像这样 dropbox.com/s/mix4lgnq0ssxbc0/Capture2.JPG?dl=0 并且我需要的数据将始终从 C6 开始
  • 抱歉延迟回复。从您的输出中,我了解到它在第一行停止,因为它是空的(即使不是您的屏幕截图中的情况)。您可以绕过它 - 更好的是,现在所有内容都从第 6 行开始,方法是调整主循环的开始位置:“for k=6:totalRows
  • 嗨 Stefanos,对于我的延迟回复,我感到更加抱歉,当时我找到了一种方法来告诉 matlab 只使用标题导入第一个“块”,但谢谢你的所有没有它,我就不会学到很多东西!
猜你喜欢
  • 2014-08-03
  • 2018-11-08
  • 1970-01-01
  • 2014-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
相关资源
最近更新 更多