[MATLAB] cell array를 csv, txt로 출력하는 함수

csvwrite_cell.m

[다운로드]

– 첨부파일 :

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

물론 과제 도중 임시로 만들어서 과제에만 테스트를 해 본 터라 모든 경우에 적용될 수 있다고 보기는 어려움.

Leave a Reply

Your email address will not be published.

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.