Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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.

like image 824
skip Avatar asked Dec 07 '11 11:12

skip


People also ask

How do I parse a CSV file in Matlab?

M = csvread( filename ) reads a comma-separated value (CSV) formatted file into array M . The file must contain only numeric values. M = csvread( filename , R1 , C1 ) reads data from the file starting at row offset R1 and column offset C1 . For example, the offsets R1=0 , C1=0 specify the first value in the file.

Can CSV files have headers?

CSV and spreadsheet content rules. Each row in the file must contain the same number of cells. This rule also applies to the header row. The first row must contain column headers.


2 Answers

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
like image 102
kol Avatar answered Oct 20 '22 03:10

kol


To extract the first line, you just need

fid = fopen('myfile.csv');
a = textscan(fid,'%s',1);
fclose(fid);
like image 23
Giuseppe Avatar answered Oct 20 '22 03:10

Giuseppe