2016-07-19 5 views
0

나는 커다란 csv 파일 (6.5millions x 25)을 가지고 있으며 그것을 Matlab에로드하려고 시도하고있다. 이미 xlsread, csvread을 시도했지만 만족스러운 결과를 얻을 수 없습니다. 나는 textscan을 사용하여 그것을 달성 할 수 있다고 읽었습니다.커다란 .csv 파일 읽기 쉼표를 사용하는 MATLAB

내 데이터는이 방법을 찾습니다

date_time;writetime;F1;F2;F3;R1;h12;b12;h_main; 
01.01.2016 0:00:01;504910801075;1;1;1;3,94;799;1515;3,877; 
01.01.2016 0:00:02;504910802314;1;1;1;3,96;795;1516;3,857; 

첫 번째 행은 헤더입니다. 기타 행은 데이터입니다. 다른 모든 행은 동일한 형식입니다.

내 코드 : 괜찮아요

fileID = fopen('value1.csv','r'); 
formatSpec = '%s; \n'; 

formatSpec1 = '%s%f %f %f %f %f %f %f %f %f %f\n'; 
A1 = fscanf(fileID, formatSpec); 

A2 = textscan(fileID, formatSpec1,'Delimiter',{';', ','}); 

내가 헤더를 읽을 수 A1에 :

A1 = 
date_time;writetime;F1;F2;F3;R1;h12;b12;h_main; 

그리고 너무 A2로 데이터를 읽습니다.

A2 = 
    {1x1 cell} [5.0491e+11] [1] [1] [1] [3] [94] [799] [1515] [3] [877] 

그러나

방법 3,94 값을 읽어?이 열에는 4 또는 0,064 값만있을 수 있기 때문에.

귀하의 도움을 바랍니다.

+0

숫자에는 항상 소수 구분 기호가 사용됩니까? like 4,00 – Finn

+1

필드는';'로 구분되므로 쉼표','를 필드 구분 기호로 사용하지 마십시오. –

+0

@Finn 아니오, 그냥 '4'일 수 있습니다. –

답변

1

나는 그들을 문자열로 취급 할 것이다. 다음 작품들.

fileID = fopen('value1.csv','r'); 
formatSpec = '%s; \n'; 
A1 = fscanf(fileID, formatSpec); 
formatSpec1 = '%s%f %f %f %f %s %f %f %s\n'; 
A2 = textscan(fileID, formatSpec1,'Delimiter',{';'}); 
A2{6} = str2double(strrep(A2{6},',','.')); 
A2{end} = str2double(strrep(A2{end},',','.')); 

{1x1 cell} [5.0491e+11] [1] [1] [1] [3.94] [799] [1515] [3.8770] 
+1

나는 같은 길을 갔다! 전에'strrep'에 대해 들어 보지 못했습니다, 감사합니다! –

+0

당신의 솔루션에 대한 하나의 개선점이 있습니다 : 우리는'strrep (char (A2 {12}), ',', ','.); strrep을 사용하는 중 오류 입력 문자열에는 행이 하나 있어야합니다. ' 그러나 우리는'str2double (strrep (A2 {12}, ',', '.'))), ' –

+0

? A2 배열의 크기는 9입니다. 맞습니까? 또한 A2 {end}는 문자열입니다. 맞습니까? – giosans