2012-05-14 2 views
3

4 열은 있지만 여러 행의 2 차원 배열을 포함하는 CSV 파일이 있습니다. 예 :Matlab, csv 파일에서 복수의 2 차원 배열을 읽습니다.

2, 354, 23, 101 
3, 1023, 43, 454 
1, 5463, 45, 7657 

4, 543, 543, 654 
3, 56, 7654, 344 

... 

나는 그러나 csvread, dlmreadtextscan 모두가 빈 줄을 무시하고, 나는 데이터의 각 블록에 대한 작업을 실행할 수있는 데이터는 가져올 수 있어야합니다.

어디서나 솔루션을 찾을 수없는 것 같은데 어떻게 할 수 있습니까?

는 PS :

그것은 형식의 파일이 위의 사실은 하나의 데이터 블록 만 (포함 된 많은 파일의 연결 있음을 주목할 필요가있을 수 있습니다 내가 원하는하지 않습니다는 수천 읽을 필요합니다 파일을 매번) 블록 사이의 빈 줄을 다른 구분 기호/표식으로 변경할 수 있습니다. 이것은 파이썬 스크립트로 끝난다.

편집 : 내 솔루션 -에/기반 내가 빠른 textscan으로 csvread을 대체

아래 petrichor에 의해 영감을 된. 그런 다음 빈 라인을 대신 나노 라인으로 교체하면 (파이썬 스크립트 수정) 두 번째 필요성을 제거 할 수 있다고 생각했습니다. textscan 느린 포인트. 내 코드는 다음과 같습니다 0.28s (단지의 103,000 라인의 파일)으로 평가 어느

filename = 'data.csv'; 
fid = fopen(filename); 
allData = cell2mat(textscan(fid,'%f %f %f %f','delimiter',',')); 
fclose(fid); 

nanLines = find(isnan(allData(:,1)))'; 

iEnd = (nanLines - (1:length(nanLines))); 
iStart = [1 (nanLines(1:end-1) - (0:length(nanLines)-2))]; 
nRows = iEnd - iStart + 1; 

allData(nanLines,:)=[]; 

data = mat2cell(allData, nRows); 

. 실제로 초기 문제를 가장 잘 해결해 주므로 Petrichor의 솔루션을 받아 들였습니다. 귀하의 데이터에 대해 다음 제공

+0

나는 방법 중 하나가 NaN NaN의 NaN의 NaN이 같은 뭔가 빈 줄을 대체하는 다음 csvread를 사용하여 데이터를로드 한 후 것이라고 가정 또는 당신이 데이터를 통해 루프와 MATLAB에서 블록을 아주 쉽게 추출 할 수있는 비슷한. – Dan

+0

나는 전체적인 프로세스에 더 많은 시간을 추가하기 때문에 가져온 후에 데이터를 되돌릴 필요가 없다고 생각했다. 또 다른 메모에서 필자는 textscan이 가져 오는 가장 빠른 방법이라는 것을 지금까지 발견했습니다. –

+0

구분 기호를 전혀 사용하지 않고 새로운 블록이 시작될 때의 행 인덱스 인 두 번째 파일을 만든 다음이 파일을 사용하여 각각에 대해 별도의 행렬을 작성하지 않고 작업 할 행 범위를 정의 하시겠습니까? – Dan

답변

1
filename = 'data.txt'; 

%# Read all the data 
allData = csvread(filename); 

%# Compute the empty line indices 
fid = fopen(filename); 
lines = textscan(fid, '%s', 'Delimiter', '\n'); 
fclose(fid); 
blankLines = find(cellfun('isempty', lines{1}))'; 

%# Find the indices to separate data into cells from the whole matrix 
iEnd = [blankLines - (1:length(blankLines)) size(allData,1)]; 
iStart = [1 (blankLines - (0:length(blankLines)-1))]; 
nRows = iEnd - iStart + 1; 

%# Put the data into cells 
data = mat2cell(allData, nRows) 

:

data = 

    [3x4 double] 
    [2x4 double] 
+1

감사합니다 petrichor, 좋은 해결책. 위에서 언급 한 내용에서 데이터를 반복하지 않기를 희망했지만 솔루션이 좋은 중간 지점을 제공합니다. 내 실제 데이터 타이밍 : csvread는 0.46 초, textscan은 0.26 초 밖에 걸리지 않습니다. 따라서 textscan으로 csvread를 대체 할 때의 솔루션은 총 0.49 초 밖에 걸리지 않습니다. 나는 여전히 '한 걸음'의 길인지 궁금해. 많은 감사합니다. –

관련 문제