csvwrite_cell.m
[다운로드]
– 첨부파일 :
[개요]
MATLAB 에서 cell array를 csv 파일로 저장하려 할 때, cell2mat를 통해 기존 csvwrite 함수를 활용하는 방법이 있지만 cell 안에 문자열 데이터가 있을 경우 cell2mat 부터 에러가 납니다.
이런 문자열이 섞인 cell array(xls 형식과 흡사한)를 바로 csv로 출력하는 간단한 함수를 matlab 과제 중 필요에 의해 만들어봤는데, 컴공이라 가능성은 별로 없지만 혹시나 나중에 쓸 일이 있을까 해서 저장해둡니다.
물론 최적화가 되어 있는지는 별개의 문제(…)
[사용법]
csvwrite_cell( 파일로 저장할 cell array, 저장할 경로, 모드(.csv 또는 .txt) )
[소스 코드]
% cell을 csv, txt로 저장 function csvwrite_cell(celltable, path, mode) % write 모드 확인 % if ( mode == 'csv' ) % csv 모드 line_feed = '\n'; separator = ','; elseif ( mode == 'txt' ) % txt 모드 line_feed = '\r\n'; separator = '\t'; else % 기타 line_feed = '\n'; separator = ','; end fp = fopen(path, 'w'); % 파일 포인터 열기 size_of_table = size(celltable); % cell array 크기 if ( mode == 'csv' ) % csv 모드 for ( count_row = 1:size_of_table(1) ) % row를 1부터 끝까지 for ( count_col = 1:size_of_table(2) ) % col을 1부터 끝까지 % 문자열일 때 % if ( ischar(cell2mat(celltable(count_row, count_col))) == 1 ) fprintf(fp, '"%s"', cell2mat(celltable(count_row, count_col))); % 실수일 때 % else fprintf(fp, '%f', cell2mat(celltable(count_row, count_col))); end if ( rem(count_col, size_of_table(2)) == 0 ) fprintf(fp, line_feed); % 개행해야 할 때는 개행문자 else fprintf(fp, separator); % 기타의 경우는 구분자 end end end elseif ( mode == 'txt' ) % txt 모드 for ( count_row = 1:size_of_table(1) ) % row를 1부터 끝까지 for ( count_col = 1:size_of_table(2) ) % col을 1부터 끝까지 % 문자열일 때 % if ( ischar(cell2mat(celltable(count_row, count_col))) == 1 ) fprintf(fp, '%s', cell2mat(celltable(count_row, count_col))); % 정수일 때 % else fprintf(fp, '%d', cell2mat(celltable(count_row, count_col))); end if ( rem(count_col, size_of_table(2)) == 0 ) fprintf(fp, line_feed); % 개행해야 할 때는 개행문자 else fprintf(fp, separator); % 기타의 경우는 구분자 end end end else % 기타 for ( count_row = 1:size_of_table(1) ) % row를 1부터 끝까지 for ( count_col = 1:size_of_table(2) ) % col을 1부터 끝까지 % 문자열일 때 % if ( ischar(cell2mat(celltable(count_row, count_col))) == 1 ) fprintf(fp, '%s', cell2mat(celltable(count_row, count_col))); % 실수일 때 % else fprintf(fp, '%f', cell2mat(celltable(count_row, count_col))); end if ( rem(count_col, size_of_table(2)) == 0 ) fprintf(fp, line_feed); % 개행해야 할 때는 개행문자 else fprintf(fp, separator); % 기타의 경우는 구분자 end end end end fclose(fp); end
물론 과제 도중 임시로 만들어서 과제에만 테스트를 해 본 터라 모든 경우에 적용될 수 있다고 보기는 어려움.