首页 文章

使用MATLAB读取CSV文件?

提问于
浏览
14

我试图用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上它似乎被解释为一个数字,所以它试图读取数字并在反斜杠处失败 . 这是我认为至少会发生的事情 . 任何帮助将非常感激 .

3 回答

  • 6

    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};
    

    Update (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
    
  • 26

    不幸的是the documentationcsvread 明确指出:

    M = csvread(filename)读取以逗号分隔的值格式化文件filename . 该文件只能包含数值 .

    由于 / 既不是逗号,也不是数值,因此会产生错误 .

  • 2

    您可以使用 readtable ,因为它将接受任何输入 .

    https://www.mathworks.com/help/matlab/ref/readtable.html

相关问题