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



但是返回的 temp 是 单元格。 temp 不应该是 单元格吗?

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

最佳答案

这实际上是 Excel COM 接口(interface)的工作方式,所以你不能责怪 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 以外的其他平台了)

关于matlab - xlsread() 认为我的 1 行 CSV 有 1048576 行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16700909/

10-11 22:35
查看更多