【问题标题】:csvread drops rows in MATLABcsvread 在 MATLAB 中删除行
【发布时间】:2015-09-13 17:41:37
【问题描述】:

我在 5 列中创建了一些随机数据并将其存储为 CSV 文件。这很好用,我的 CSV 实际上包含 1001 行;我的带有标题的数据(我通过在电子表格编辑器中打开它来检查它)。但是,当我使用csvread 再次在 MATLAB 中读取它时,如果我没有指定分隔符,并且当我指定分隔符时,data 仅包含 957 行,因此缺少标题和前 42 行。这是怎么回事?

代码:

A = rand(1e3,5);
out = fopen('output.csv','w');
fprintf(out,['ColumnA', ',', 'ColumnB', ',', 'ColumnC',  ',', 'ColumnD',  ',', 'ColumnE','\n']);
fclose(out);
dlmwrite('output.csv', A, 'delimiter',',','-append');
data = csvread('output.csv',',');

错误:

使用 dlmread 时出错(第 139 行) 文件和格式字符串不匹配。 无法从文件中读取数字(第 1u 行,第 1u 字段)==> ColumnA,ColumnB,ColumnC,ColumnD,ColumnE\n

csvread 中的错误(第 48 行) m=dlmread(文件名, ',', r, c);

我在写入或读取文件时是否遗漏了一些愚蠢的东西?

我在 64 位 Windows 7 机器上运行 MATLAB R2012a。 (虽然我希望在下个月升级到 R2015b)

【问题讨论】:

    标签: matlab csv file-writing


    【解决方案1】:

    原因是您使用了无效的csvread 语法。来自help csvread

    M = csvread('FILENAME') 读取逗号分隔值格式的文件 文件名。结果在 M 中返回。文件只能包含 数值。

    M = csvread('FILENAME',R,C) 从逗号分隔值中读取数据 从 R 行和 C 列开始的格式化文件。R 和 C 为零 基于,因此 R=0 和 C=0 指定文件中的第一个值。

    M = csvread('FILENAME',R,C,RNG) 只读取指定的范围 由 RNG = [R1 C1 R2 C2] 其中 (R1,C1) 是左上角 要读取的数据和(R2,C2)是右下角。随机数 也可以使用电子表格表示法指定,如 RNG = 'A1..B7'。

    不能告诉csvread使用什么分隔符。当您以这种方式调用它时,它会将 ' 解释为数字 44(在 ascii 中)并将其用作起始行。

    改为:data = csvread('output.csv',1);

    【讨论】:

    • 当我使用分隔符时出现错误,但是当我使用时调用data = csvread('output.csv');,它可以正常工作,但是删除行。我想我只需要使用 1,干杯。我觉得有点像我没有正确阅读文档的磨砂膏〜.〜
    • @Adriaan,确实是这样,这就是我建议 1 的原因 :) 我猜如果你不指定起始行,matlab 不会尝试推断是否有字符串标题行文件,并首先将其解释为数字数据,因此出现错误。而且不要对自己太苛刻,matlab 内置的数据解析功能以古怪着称。
    【解决方案2】:

    首先,在 MATLAB 2014b 上,我有一个不同的错误

    使用 dlmread 时出错(第 138 行) HeaderLines 必须是整数值。 csvread 中的错误(第 47 行) m=dlmread(文件名, ',', r, c);

    在MATLAB中,我一般通过它的数据导入接口来导入数据。在Home 选项卡上,单击Import Data,您有很多选项可以确保数据导入正确。该接口最好的部分是代码生成功能。您可以选择生成 MATLAB 实际用于导入数据的代码。例如,这是我得到的:

    filename = 'output.csv';
    delimiter = ',';
    startRow = 2;
    formatSpec = '%f%f%f%f%f%[^\n\r]';
    fileID = fopen(filename,'r');
    dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter, 'HeaderLines', startRow-1, 'ReturnOnError', false);
    fclose(fileID);
    ColumnA = dataArray{:, 1};
    ColumnB = dataArray{:, 2};
    ColumnC = dataArray{:, 3};
    ColumnD = dataArray{:, 4};
    ColumnE = dataArray{:, 5};
    clearvars filename delimiter startRow formatSpec fileID dataArray ans;
    

    它工作正常。如您所见,您可以轻松修改代码以根据需要定制导入功能。

    【讨论】:

    • 通过 GUI 导入数据是相当丑陋和低效的,尤其是在使用文件读取器和dir() 一起读取大量文件时。
    • 我使用 GUI 的原因是获取用于导入结构相当奇怪的数据集的代码。一旦我得到代码,我就不再使用 GUI。 GUI 的目的是在事情变得非常复杂并且现有功能无法轻松处理导入时为您提供帮助。在这方面,我确实觉得这个 GUI 很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-24
    相关资源
    最近更新 更多