Matlab xlsread()认为我的单行CSV有1048576行

Matlab xlsread()认为我的单行CSV有1048576行,matlab,csv,file-io,Matlab,Csv,File Io,我想使用[~,~,temp]=xlsread('1.csv','A:A')获取单行CSV文件的第一列1.CSV 1.csv只包含一行: 5B0E8795E18013D0FBC33558F0512832,3,7,1,练习,榨汁机,榨汁机,对,错,2347.0,0 但是,返回的temp是一个单元格。temp不应该是一个单元格吗 参数'A:A'应仅返回第一列的现有行,如中的“读取数据列”示例所示。由于temp是一个单元格,因此使用'a:a'似乎会返回整个列,包括不存在的行(1048576是Micros

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

1.csv
只包含一行:

5B0E8795E18013D0FBC33558F0512832,3,7,1,练习,榨汁机,榨汁机,对,错,2347.0,0

但是,返回的
temp
是一个单元格。
temp
不应该是一个单元格吗

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

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


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

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

你为什么要使用
xlsread
读取CSV文件?为什么不使用
csvread
?xlsread()文档中说:“在使用Microsoft Excel软件的Windows®系统上,xlsread可以读取您的Excel版本识别的任何文件格式。”因此,我认为它应该可以工作。使用textscan()更为繁琐。至于
csvread
,根据以及
csvread
文档:“csvread仅适用于数字数据”,因此我无法使用它。是的,我也很惊讶
csvread
无法处理非数字数据。您能尝试将该CSV文件保存为XLS(X)格式,并测试
xlsread
是否可以处理该文件吗?如果是这样,我宁愿忘记使用
xlsread
读取CSV文件。文档可能在这里,我想这是个bug。我在Win7 64 R2013a Excel2010上观察到了相同的行为。我会向TMW汇报,并让我们了解最新情况。混淆是由示例引入的,这就是为什么问题首先出现的原因。根据“”,对行为的期望是不同的。我忘了说,您在文档中提到的示例使用了
xlsread
的前两个输出,这两个输出是从第三个输出
raw
中提取的,方法是删除您上面看到的nan单元格,并过滤为数字/文本。所以如果你写:
[~,txt]=xlsread('1.csv','A:A')你得到了你想要的东西..很好的一点,但是xlsread()文档说:“如果指定了xlRange,工作表中带数据的行和列前面的前导空白行和列将在
raw
中返回。”。这相当明确地意味着,即使在
raw
列中,也不希望返回数据后的空行。关于
textscan()
的使用,它更为冗长,无论如何都不应妨碍
xlsread
正常工作。@Frankdernoncourt:我想在某种程度上是这样的,但我认为他们指的是常规范围表示法,如
A1:C5
。Excel中的
A:A
触发返回整个列的特定行为。更不用说最近的
xlsread
@Amro-Wow了,感谢你的链接,似乎最好尽量避免
xlsread
>> val(1:3)
ans = 
    '5B0E8795E18013D0FBC33558F0512832'
    [NaN]
    [NaN]