function result=xlscsvlineparse(p_line) %the p_line is just a character array, we loop to find the beginning and %end of the commas unless there are quotes around them. i_comma=1; i_counter=0; i_linelength=length(p_line); for i=1:i_linelength if(p_line(i)==',') if(i_comma==1) i_counter=i_counter+1; a_comma(i_counter) = i; end elseif(p_line(i)=='"') if(i_comma==1) i_comma=0; else i_comma=1; end end end %now that I have a line, make a cell array based upon what was there i_cellc=1; i_start=1; for i_counter=1:length(a_comma) i_end=a_comma(i_counter); %fprintf('%s\n',p_line(i_start:i_end)); a_cell{i_cellc}=sprintf('%s',p_line(i_start:i_end)); i_cellc=i_cellc+1; i_start=i_end; end % there still should be one more here, but it's missing because of % the fact that the last ,EOL is not parsed. if(a_comma(length(a_comma))==i_linelength) a_cell{i_cellc}=',,'; else a_cell{i_cellc}=sprintf('%s',p_line(i_start:i_linelength)); end %strip out the , if it starts or ends the cell string. for i_counter=1:length(a_cell) tmp_cell = a_cell{i_counter}; if(tmp_cell(1)==',') tmp_cell=tmp_cell(2:end); end if(tmp_cell(end)==',') tmp_cell=tmp_cell(1:end-1); end %convert numbers to numbers if(valid_number(tmp_cell)==1) tmp_cell=str2num(tmp_cell); end a_cell{i_counter}=tmp_cell; % fprintf('%i: %s\n',i_counter,a_cell{i_counter}); end result=a_cell; end function result=valid_number(s_str) %this function return if s_str is a valid number i_tick=1; %default to valid. a_int=char(s_str); %to ASCII for i_counter=1:length(a_int); c_tmp=a_int(i_counter); if((c_tmp>=48)&&(c_tmp<=57)) %nothing elseif(c_tmp==46) %nothing else i_tick = i_tick -1; end; end result=i_tick; end
Saturday, November 23, 2013
Read a row of an Excel CSV file in Matlab
The only issue with CSV files in matlab is that they sometimes have commas between quotes. I wrote this function that parses the CSV file into an array of cells, but leaves the text with commas. It also figures which entries are numbers and converts those.
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment