Matlab: read only header line from a .csv-file

19,617

Solution 1

Open the file with fopen, read the header line with textscan, read the decimal numbers with fscanf, and call fclose in the end - only 4 lines in total :) Example input file:

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

Reading of this file:

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

Note that the data read by fscanf need to be transposed (I emphasized this by writing transpose instead of '). The output:

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

Solution 2

To extract the first line, you just need

fid = fopen('myfile.csv');
a = textscan(fid,'%s',1);
fclose(fid);
Share:
19,617
skip
Author by

skip

Updated on June 03, 2022

Comments

  • skip
    skip almost 2 years

    Assume there's a myfile.csv with variable names in the first row and decimal numbers in the following ones. In Matlab I'd like to read the header line and the decimal numbers separately. So far, I've been doing the following to extract the header line:

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

    Then, I use the csvread command to extract the numerical part of the file. But there should be a (much) easier way to do it! First, I don't want to read the whole file (as with a = textscan(fid,'%s','Delimiter','\n');) to extract only the first line. Second, it looks wrong to use 7 lines of code to do it - can it be done with less?

    I'd be thankful for any constructive suggestions.

  • skip
    skip over 12 years
    Thanks a lot! But what if I wanted to write the code in a more universal way, such that it can be used for files with different number of variables (instead of 3), without rewriting it each time the number of variables change?
  • kol
    kol over 12 years
    In that case I would read the header line with getl and parse it with strtok to get the number of columns, nc. After nc was determined, the format string of fscanf can be assembled using a loop (by concatenating %g's with commas in between), and its last parameter can be set to [nc, Inf]. Alternatively, you can read the numbers into a single column (using [1 Inf]), and reshape it later (no. of rows: nr = length(data(:)) / nc;).
  • skip
    skip over 12 years
    Thanks for the thorough answers!