【问题标题】:Matlab: read only header line from a .csv-fileMatlab:只读来自 .csv 文件的标题行
【发布时间】:2011-12-07 11:05:36
【问题描述】:

假设有一个 myfile.csv,第一行是变量名,后面是十进制数。在 Matlab 中,我想分别阅读标题行和十进制数字。到目前为止,我一直在执行以下操作来提取标题行:

fid = fopen('myfile.csv');
a = textscan(fid,'%s','Delimiter','\n');
b = a{1,1};
fclose(fid);
c = textscan(b,'%s','Delimiter',',');
d = c{1}

然后,我使用 csvread 命令提取文件的数字部分。但是应该有一个(更)更简单的方法来做到这一点!首先,我不想读取整个文件(如a = textscan(fid,'%s','Delimiter','\n');)来仅提取第一行。其次,用 7 行代码来做这件事看起来是不对的——能用更少的代码来做吗?

如果有任何建设性的建议,我将不胜感激。

【问题讨论】:

  • 感谢第 3 行。另外,这样看起来更好:)

标签: matlab file-io csv


【解决方案1】:

fopen打开文件,用textscan读取标题行,用fscanf读取十进制数字,最后调用fclose——总共只有4行:)示例输入文件:

Weight,Size,Count
1,2,3
4,5,6
7,8,9
10,11,12

读取此文件:

fid = fopen('myfile.csv', 'r');
header = textscan(fid, '%[^,],%[^,],%[^,\r\n]', 1);
data = transpose(fscanf(fid, '%g,%g,%g\n', [3, Inf]));
fclose(fid);

for i = 1 : 3; disp(['"' cell2mat(header{i}) '"']); end;
disp(data);

注意fscanf读取的数据需要转置(我通过写transpose而不是'来强调这一点)。输出:

"Weight"
"Size"
"Count"
     1     2     3
     4     5     6
     7     8     9
    10    11    12

【讨论】:

  • 非常感谢!但是,如果我想以更通用的方式编写代码,以便它可以用于具有不同数量的变量(而不是 3 个)的文件,而无需在每次变量数量发生变化时重写它呢?
  • 在这种情况下,我会用getl 读取标题行并用strtok 解析它以获得列数nc。确定nc后,fscanf的格式串可以用循环组装(%g之间用逗号连接),最后一个参数可以设置为[nc, Inf]。或者,您可以将数字读入一列(使用[1 Inf]),然后再对其进行整形(行数:nr = length(data(:)) / nc;)。
  • 感谢您的详尽解答!
【解决方案2】:

要提取第一行,你只需要

fid = fopen('myfile.csv');
a = textscan(fid,'%s',1);
fclose(fid);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-05
    • 2013-02-16
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    相关资源
    最近更新 更多