我正在尝试使用MATLAB读取.csv文件。这是我的代码:
csvread('out2.csv')
这就是out2.csv的样子:
03/09/2013 23:55:12,129.32,129.33
03/09/2013 23:55:52,129.32,129.33
03/09/2013 23:56:02,129.32,129.33
在Windows上,我可以使用xlsread函数读取这个完全相同的文件,没有任何问题。我目前在linux机器上。当我第一次使用xlsread读取文件时,我被告知“文件不是可识别的格式”,所以我切换到使用csvread。但是,使用csvread,我收到以下错误消息:
Error using dlmread (line 139)
Mismatch between file and format string.
Trouble reading number from file (row 1u, field 2u) ==> /09/2013
23:55:12,129.32,129.33\n
Error in csvread (line 48)
m=dlmread(filename, ',', r, c)
我认为日期中的'/'导致问题。在Windows上,第1列被解释为字符串。在linux上它似乎被解释为一个数字,所以它试图读取数字并在反斜杠处失败。这是我认为至少会发生的事情。任何帮助都会非常感激。
答案 0 :(得分:26)
csvread
只能读取双打,所以它在日期字段上窒息。使用textscan
。
fid = fopen('out2.csv');
out = textscan(fid,'%s%f%f','delimiter',',');
fclose(fid);
date = datevec(out{1});
col1 = out{2};
col2 = out{3};
更新(8/31/2017)
由于这是在2013年写回来的,因此MATLAB的textscan
功能已更新,可以直接读取日期和时间。现在代码看起来像这样:
fid = fopen('out2.csv');
out = textscan(fid, '%{MM/dd/uu HH:mm:ss}D%f%f', 'delimiter', ',');
fclose(fid)
[date, col1, col2] = deal(out{:});
@Victor Hugo下面提到的一个替代方案(目前我个人对此类情况的看法)将使用readtable
,它将接受与textscan
相同的格式字符串但是汇编结果直接进入表对象:
dataTable = readtable('out2.csv', 'Format', '%{MM/dd/uu HH:mm:ss}D%f%f')
dataTable.Properties.VariableNames = {'date', 'col1', 'col2'};
dataTable =
3×3 table
date col1 col2
___________________ ______ ______
03/09/2013 23:55:12 129.32 129.33
03/09/2013 23:55:52 129.32 129.33
03/09/2013 23:56:02 129.32 129.33
答案 1 :(得分:6)
不幸的是,csvread
的{{3}}明确指出:
M = csvread(filename)
读取以逗号分隔的值格式文件filename
。 该文件只能包含数值。
由于/
既不是逗号,也不是数值,因此会产生错误。
答案 2 :(得分:2)
您可以使用readtable
,因为它会接受任何输入。
答案 3 :(得分:0)
是的xlsread需要安装Microsoft Excel,除非它以“基本”模式运行并且“基本”模式仅读取.xls .xlsx和.xlsm文件。
另一种替代方法是在MATLAB的文件交换中发布许多用户编写的函数,这些函数将在Linux上运行,并且在读取未格式化的内容时更加灵活。