2010-01-11 2 views
6

나중에 출력 할 수 있도록 CSV 파일에 출력을 저장하는 스크립트를 작성했지만 데이터를 가져 오는 두 번째 스크립트는 다시 읽는 데 시간이 오래 걸립니다.MATLAB에서 CSV 파일을 가장 빨리 가져 오는 방법

데이터는 다음과 같은 형식이다

헤더는 가장 왼쪽 컬럼에있는
Item1,val1,val2,val3 
Item2,val4,val5,val6,val7 
Item3,val8,val9 

, 데이터 값은 행의 나머지를 차지한다. 하나의 큰 어려움은 데이터 값의 배열이 각 테스트 항목마다 다른 길이가 될 수 있다는 것입니다. 구조로 저장 하겠지만 MATLAB 환경 외부에서 편집 할 수 있어야합니다. 때로는 MATLAB이 설치되지 않은 컴퓨터에서 잘못된 데이터 행을 삭제해야하기 때문입니다. 그래서 정말로, 제 질문 중 하나는 : 다른 형식으로 데이터를 저장해야합니까? 질문의

두 번째 부분 : 나는 importdata, csvreaddlmread을 시도했습니다,하지만 난 가장 적합한 확실하지 않다, 또는 더 나은 솔루션이 있다면. 지금은 루프를 사용하여 내 자신의 스크립트를 사용하고 있습니다. fgetl은 대용량 파일의 경우 대단히 느립니다. 어떤 제안?

function [data,headers]=csvreader(filename); %V1_1 
fid=fopen(filename,'r'); 
data={}; 
headers={}; 
count=1; 
while 1 
     textline=fgetl(fid); 
     if ~ischar(textline), break, end 
     nextchar=textline(1); 
     idx=1; 
     while nextchar~=',' 
     headers{count}(idx)=textline(1); 
     idx=idx+1; 
     textline(1)=[]; 
     nextchar=textline(1); 
     end 
     textline(1)=[]; 
     data{count}=str2num(textline); 
     count=count+1; 
end 
fclose(fid); 

(I이 아마 몹시 작성 코드를 알고 - 내가 날 소리하지 마십시오 엔지니어가 아닌 프로그래머 해요 -. 개선을위한 제안, 그래도 환영받을 것)

답변

10

Item1,1,2,3,NaN 
Item2,4,5,6,7 
Item3,8,9,NaN,NaN 

또는 당신도 바로 인쇄 할 수있는 빈 필드 :

,536 아마 패드 첫 번째 스크립트를 생성 NaN 값으로 파일이있을 경우 읽기 데이터를 쉽게 만들 것
Item1,1,2,3, 
Item2,4,5,6,7 
Item3,8,9,, 

물론 제대로 패드하려면 모든 항목의 최대 값 수를 알아야합니다. 위의 두 형식으로, 당신은 예를 들어 TEXTSCAN 같은 표준 파일 읽기 기능 중 하나를 사용할 수 있습니다

>> fid = fopen('uneven_data.txt','rt'); 
>> C = textscan(fid,'%s %f %f %f %f','Delimiter',',','CollectOutput',1); 
>> fclose(fid); 
>> C{1} 

ans = 

    'Item1' 
    'Item2' 
    'Item3' 

>> C{2} 

ans = 

    1  2  3 NaN %# TEXTSCAN sets empty fields to NaN anyway 
    4  5  6  7 
    8  9 NaN NaN 
3

를 대신 한 번에 문자열을 텍스트 라인 하나 개의 문자를 구문 분석의. 모든 값이 수치 경우 당신은 예를

stringParts = {}; 
tline = fgetl(fid); 
if ~ischar(tline), break, end 
i=1; 
while 1 
    [stringParts{i},r]=strtok(tline,','); 
    tline=r; 
    i=i+1; 
    if isempty(r), break; end 
end 

% store the header 
headers{count} = stringParts{1}; 

% convert the data into numbers 
for j=2:length(stringParts) 
    data{count}(j-1) = str2double(stringParts{j}); 
end 
count=count+1; 
+0

strtok 추천 +1 - 전에 존재하지 않았다. – Doresoom

0

Q1)는 컬럼의 최대 수를 알고 있다면 당신은 또한 NaN이 빈 항목을 채울 수의 문자열을 깨고 strtok를를 사용할 수 있습니다, 당신이 정말로 필요합니까 "품목 번호"란? '예'인 경우 '#'만 사용할 수 있으므로 모든 데이터가 숫자입니다.

Q2) num을 읽는 가장 빠른 방법입니다. mex-files가없는 파일의 데이터는 csvread입니다. 나는 CSV 파일에서 문자열을 사용하지 않도록 노력하지만, 내가 필요하다면, 내 csv2cell 기능 사용 : 내가 matlab에에서 독서 CSV 데이터와 같은 문제를 했어

http://www.mathworks.com/matlabcentral/fileexchange/20135-csv2cell

+0

항목 # 열은 실제로 텍스트 레이블이므로 예, 필요합니다. 나는 그것을 분명히해야만했다. – Doresoom

1

을, 나는 놀랐다 얼마나 적은 지원이 있느냐에 달려 있지만 가져 오기 데이터 도구를 찾았습니다. 나는 r2015b에있다.

"홈"탭의 상단 표시 줄에서 "데이터 가져 오기"를 클릭하고 읽을 파일을 선택하십시오.앱 창은 다음과 같이 올 것입니다

Import Data tool screenshot

에서 "가져 오기 선택이"당신은 당신이 빈 셀을 채우는 방법을 포함하여 사용자 정의 옵션, 꽤 준다 "기능을 생성"할 수있는 옵션을 가지고, 출력 데이터 구조를 원하는 것입니다. 또한 매스 웍스 (MathWorks)가 작성 했으므로 CSV 파일을 읽을 때 가장 빠른 방법을 사용하고있을 것입니다. 그것은 내 파일에서 거의 순간적이었다.