4

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

1.csv仅包含一行:

5B0E8795E18013D0FBC33558F0512832,3,7,1,练习,榨汁机,榨汁机,真,假,2347.0,0

但是返回temp的是 <1048576x1> 单元格。不temp应该是 <1x1> 单元格吗?

该参数'A:A'应仅返回第一列的现有行,如xlsread() 文档中的“读取数据列”示例所示。由于temp是 <1048576x1> 单元格,因此似乎 using'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。

4

1 回答 1

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 以外的其他平台)

于 2013-05-22T22:53:35.733 回答