xlsread()认为我的1行CSV有1048576行

时间:2013-05-22 20:20:55

标签: matlab csv file-io

我想使用[~, ~, temp] = xlsread('1.csv','A:A');获取1行CSV文件1.csv的第一列。

1.csv只包含一行:

  

5B0E8795E18013D0FBC33558F0512832,3,7,1,实践,榨汁机,榨汁机,TRUE,FALSE,2347.0,0

但是,返回的temp是< 1048576x1>细胞。 temp不应该是< 1x1>细胞

参数'A:A'应仅返回第一列的现有行,如xlsread() documentation中的“读取数据列”示例所示。由于temp是< 1048576x1>单元格,似乎使用'A:A'返回整个列,包括不存在的行(1048576是Microsoft Excel 2010中的最大行数)。

使用textscan()工作正常(= datatemp在以下代码段中只有1行):

fid = fopen('1.csv','r');
datatemp = textscan(fid, '%s %d %d %d %s %s %s %s %s %d %d', 'delimiter',',', 'CollectOutput',true)
fclose(fid);

但是我不明白为什么xlsread()无法正常工作。我使用MATLAB R2012a 64位,Microsoft Excel 2010和Windows 7 x64。

1 个答案:

答案 0 :(得分:3)

这实际上就是Excel COM界面的工作方式,所以你不能责怪MATLAB:)

这是一个基本上在内部执行xlsread的示例代码。您可以在VBScript / Powershell中编写代码并获得相同的结果......

%# create Excel COM server
Excel = actxserver('excel.application');

%# open file
Excel.workbooks.Open(which('1.csv'), 0, true);
Excel.Worksheets.Item(1).Activate();
Excel.Visible = true;

%# select first column
Excel.Range('A:A').Select();
val = Excel.Selection.Value();

%# close
Excel.Quit();
Excel.delete();

变量val返回:

>> whos val
  Name            Size               Bytes  Class    Attributes

  val       1048576x1             71303224  cell               

其中除第一个之外的所有单元格都是NaN:

>> val(1:3)
ans = 
    '5B0E8795E18013D0FBC33558F0512832'
    [NaN]
    [NaN]

我不明白为什么你不使用textscan将文件解析为文本,这比调用COM要快得多(更不用说移植到Windows以外的其他平台)