如何让MATLAB xlsread读取到连续的&lt; <data-range>&gt;的最后一行?</data-range>

时间:2014-11-05 19:46:05

标签: excel matlab

我想在MATLAB中使用xlsread来读取Excel文件。

虽然我知道我想要读取哪些列,以及我想从哪一行开始读取,但该文件可以包含任意数量的行。

有没有办法做

array = xlsread( 'filename', 'D4:F*end*' );              %% OR ANY SIMILAR SYNTAX

F*end* 是F列中的最后一行?

4 个答案:

答案 0 :(得分:1)

xls格式的Excel文件中,65536似乎是您可以使用的行数限制。您可以将此数字与F一起使用,这基本上可以告诉MATLAB搜索到文件末尾。我只能通过挖掘这些工作来收集所有这些,这个技巧/黑客似乎工作正常。

总而言之,这似乎可以解决xls个文件 -

的问题
array = xlsread('filename', 'D4:F65536')  

对于xlsx个文件,限制似乎为1048576,因此代码将更改为 -

array = xlsread('filename', 'D4:F1048576')  

外部source以确认行数限制 -

  

Excel版本97-2003(Windows)的文件扩展名为XLS和   工作表大小为65,536行和256列。在Excel 2007和2010中   默认文件扩展名为XLSX,工作表大小为1,048,576   行和16,384列。

答案 1 :(得分:1)

是。试试这个:

FileFormat = '.xls' or '.xlsx';                         % choose one
                                                        % ( by default MATLAB
                                                        % imports only '.xls' )
filename   = strcat( 'Filename you desire', FileFormat );

array      = xlsread( filename )                        % This will read all
                                                        % the Matrix ( by default
                                                        % MATLAB will import all
                                                        % numerical data from
                                                        % file with this syntax )

然后,您可以查看矩阵的大小以优化搜索/导入。

[nRows,nCols] = size( array );

然后,如果要导入的矩阵只是矩阵的一部分,则可以这样做:

NewArray = xlsread( filename, strcat( 'initial cell',
                                      ':',
                                      'ColumnLetter',
                                      num2str( nRows )
                                      )
                   );
% for your case:

NewArray = xlsread( filename, strcat( 'D3', ':', 'F', num2str( nRows ) ) );

希望这有帮助。

答案 2 :(得分:1)

您可以逐列阅读:

col1= xlsread( 'filename', 'D:D' );
col2= xlsread( 'filename', 'E:E' );
col3= xlsread( 'filename', 'F:F' );
...

不提供行号(例如D12:D465),Matlab会像你期望的那样处理D:D。 col1,col2和col3将具有不同的大小,具体取决于从每列中提取的数据量。

我没有尝试过这样的想法,我不知道它是否会起作用:

    colAll= xlsread( 'filename', 'D:F' );

答案 3 :(得分:0)

不,但是......

MATLAB没有直接执行此操作的记录或未记录的功能。

直接MATLAB支持下可以使用的最大值是:

___ = xlsread(filename,-1) opens an Excel window to interactively select data.

      Select the worksheet, drag and drop the mouse over the range you want,
      and click OK.
      This syntax is supported only on Windows systems with Excel software.

仍然如何有效地处理任务并面向未来?

“盲”黑盒方法是首先测试存在数据的连续区域的边界 - 使用任何可行的迭代器,首先通过加倍盲测试步距来前进步进测试的单元格aRowToTEST = ( aRowToStartFROM + aRowNumberDistanceToTEST )如果测试的单元格包含数字,请设置aLastNonEmptyROW = aRowToTEST;加倍aRowNumberDistanceToTEST并重复。

如果aRowToTEST指向格式特定的最大行号“后面”,请设置aRowToStartFROM = aLastNonEmptyROW;并重置前进距离aRowNumberDistanceToTEST = 1;以继续前进步进迭代,加倍 - 一步一步。如果再次达到此限制,请执行步骤== 1并指向格式特定限制的“后面”,则您的工作表审核将包含数据,直到最后一行(完成特定格式的“边缘”) )。

但是一旦目标单元格 为空/ NaN,停止正向步进阶段并通过将找到/失败(空)单元格{{1}之间的间隔减半来启动标准后退步进阶段和aFirstEmptyROW = aRowToTEST;的最后一个已知单元格,包含数字。

同样,如果被测试的细胞包含公允价值,请将aLastNonEmptyROW - 边界移至aLastNonEmptyROW值,否则,移动方式aRowToTEST - 边界。

最后设置aFirstEmptyROW

重复上述步骤,直到您的步骤 aBackSteppingSTEP = ( aFirstEmptyROW - aLastNonEmptyROW )/2; aRowToTEST = aFirstEmptyROW - aBackSteppingSTEP; ,从而迭代地找到了连续的数据区边界。

这比raw-dumb-import-whole-sheet更快,更无效,并且在XLS {{1}的64k或1M或任何进一步上限之前工作。 }。

拥有边界,只需< 1