2012-12-31 4 views
0

필자는 한 줄씩 읽는 데이터 세트를 디스크에 가지고 있으며, 데이터 열 중 하나를 (해당 날짜의) 0-23.99999 범위의 float 벡터로 변환하고 싶습니다.Octave에서 textscan() 사용 ... 형식을 올바르게 지정하는 방법?

데이터는 다음과 같이 보입니다 :

2010/01/01,00:00:00.979131, 27.4485, 51.9362, 14.8, 6 
2010/01/01,00:00:01.021977, 27.5149, 51.9375, 16.0, 6 
2010/01/01,00:00:01.074032, 27.4797, 51.9446, 14.5, 10 
2010/01/01,00:00:01.663689, 25.8441,-152.8141, 14.6, 6 
2010/01/01,00:00:01.639541, 25.8744,-152.6122, 1.5, 5 
2010/01/01,00:00:02.232099, -2.2447, 11.5023, 18.8, 6 
2010/01/01,00:00:02.256351, -0.8135, 27.3139, 17.7, 5 
2010/01/01,00:00:02.306734, -2.7797, 28.5109, 26.0, 5 
2010/01/01,00:00:02.620765, 25.6656,-154.2029, 26.2, 9 
2010/01/01,00:00:02.658495, 25.6698,-154.2157, 23.0, 6 
2010/01/01,00:00:02.731266, -5.7106, 126.4517, 3.6, 5 
2010/01/01,00:00:02.787495, -5.7138, 126.5210, 24.4, 8 
2010/01/01,00:00:02.811636, -3.2453, 124.6919, 21.1, 8 

2 열 (예 : 00 : 00 : 00.979131)은 관심 내가

setenv GNUTERM 'x11'; 
fid = fopen('myfile.txt', 'r'); 
m = textscan(fid, '%d%d%d%d/%d%d/%d%d, %d%d:%d%d:%d%f, %f, %f, %f, %d'); 
mx = m(:, 5); %here, I would expect to grab 14.8, 16.0, etc 
my = m(:, 2)/24.0; %here, all data from timestamp column (00:00:00.979131, for ex) 
plot(mx, my); 

문제 같은 것을 할 싶습니다 textscan에 전달한 문자열이 내 데이터에 대해 형식이 잘못되었습니다. 해당 숫자의 서식은 군사 시간대에 "시 : 분 : 초"입니다. vars mx 또는 my에 대한 값을 액세스하거나 변환하려면 어떻게해야합니까? 작동하지만, 그것은 내가 여러 부분으로 원하는 시간 형식 VAR을두고,

m = textscan(fid, '%d/%d/%d %d:%d:%f %f %f %f %d', 'delimiter', ','); 

... : 당신이 뭔가를 할 수있는 것처럼

감사합니다, JML

+1

'csvread'는이 작업에 적합하지 않습니다. 'textscan' 시도 – carandraug

+0

확인 코드와 질문을 업데이트했습니다. 내가 틀린 w/r/t textscan()의 입력은 무엇입니까? – jml

+0

또한 '% d/% d/% d, % d : % d : % f, % f, % f, % f, % d'을 사용해 보았습니다. – jml

답변

4

textscan의 출력은 셀 배열입니다. 당신이 당신의 대답에 명령을 사용하는 경우 : 하루의 시작부터 타임 스탬프 (초를 얻기 위해, 그리고

MyNinthField = m{9}; 

MyNinthField = 
14.8000 
16.0000 
14.5000 
14.6000 
1.5000 
18.8000 
17.7000 
26.0000 
26.2000 
23.0000 
3.6000 
24.4000 
21.1000 

:

m = textscan(fid, '%d/%d/%d %d:%d:%f %f %f %f %d', 'delimiter', ','); 

그런 다음 14.9의 수직 벡터, 16.0, 14.5를 얻을 수 있습니다) : m{6} 이미 double 때문에 Secondsdouble를 들어

Hours = double(m{4}); 
Minutes = double(m{5}); 
Seconds = m{6}; 

은 필요하지 않습니다. 그러나 m{4}m{5}은 모두 int32입니다.

초 하루의 시간을 얻으려면, 당신이 필요로하는 모든입니다 : 당신이 int32에서 double에 타입 변환을 수행하지 않은 경우

TimeOfDayInSeconds = 3600*Hours+60*Minutes+Seconds; 

TimeOfDayInSeconds = 
0.97913 
1.02198 
1.07403 
1.66369 
1.63954 
2.
2.25635 
2.30673 
2.62077 
2.65849 
2.73127 
2.78749 
2.81164 

는 옥타브는 정수 값을자를 것이다. 그러나 MATLAB은 정수 배열과 이중 배열의 합을 허용하지 않습니다.

희망이 도움이됩니다.

+0

명확하고 완전한 답변을 주셔서 감사합니다. – jml

0

이 보이는 var. 아무것도없는 것보다는 낫다. 이후에이 변수들을 연결하는 방법에 대한 제안이 있다면 누구나 더 읽고 싶을 것입니다. 감사!

관련 문제