2017-09-22 5 views
0

아래의 옥타브 스크립트에서 데이터를 조작하고 옥타브로로드 한 다음 조작 된 데이터 (행렬)를 쓰려고 시도하면서 디렉토리의 파일을 반복하고 있습니다. 이름이 입력 파일 이름에서 파생 된 새 파일. 조작 된 데이터는 저장할 파일과 이름이 같은 변수 이름에 할당됩니다. 원하지 않는 모든 변수는 지워지고 저장 명령 은 할당 된 단일 변수 행렬을 " new_filename. "할당 된 옥타브 변수가 파일에 저장되지 않습니다.

그러나이 마지막 저장/쓰기 명령은 발생하지 않으며 이유는 알 수 없습니다. 특정 변수 명령이 없으면 save 함수는 범위에있는 모든 변수를 저장해야합니다.이 경우에는 저장할 행렬 하나만 있습니다. 왜 이것이 작동하지 않습니까?

clear all ; 

all_raw_OHLC_files = glob("*_raw_OHLC_daily") ; % cell with filenames matching *_raw_OHLC_daily 

for ii = 1 : length(all_raw_OHLC_files) % loop for length of above cell 

filename = all_raw_OHLC_files{ii} ; % get files' names 

% create a new filename for the output file 
split_filename = strsplit(filename , "_") ; 
new_filename = tolower([ split_filename{1} "_" split_filename{2} "_ohlc_daily" ]) ; 

% open and read file 
fid = fopen(filename , 'rt') ; 
data = textscan(fid , '%s %f %f %f %f %f %s' , 'Delimiter' , ',' , 'CollectOutput', 1) ; 
fclose(fid) ; 
ex_data = [ datenum(data{1} , 'yyyy-mm-dd HH:MM:SS') data{2} ] ; % extract the file's data 

% process the raw data in to OHLC bars 
weekday_ix = weekday(ex_data(: , 1)) ; 
% find Mondays immediately preceeded by Sundays in the data 
monday_ix = find((weekday_ix == 2) .* (shift(weekday_ix , 1) == 1)) ; 
sunday_ix = monday_ix .- 1 ; 

% replace Monday open with the Sunday open 
ex_data(monday_ix , 2) = ex_data(sunday_ix , 2) ; 

% replace Monday high with max of Sunday high and Monday high 
ex_data(monday_ix , 3) = max(ex_data(sunday_ix , 3) , ex_data(monday_ix , 3)) ; 

% repeat for min of lows 
ex_data(monday_ix , 4) = min(ex_data(sunday_ix , 4) , ex_data(monday_ix , 4)) ; 

% combines volume figures 
ex_data(monday_ix , 6) = ex_data(sunday_ix , 6) .+ ex_data(monday_ix , 6) ; 

% now delete the sunday data 
ex_data(sunday_ix , :) = [] ; 

assignin("base" , tolower([ split_filename{1} "_" split_filename{2} "_ohlc_daily" ]) , ex_data) 

clear ans weekday_ix sunday_ix monday_ix ii filename split_filename fid ex_data data all_raw_OHLC_files 

% print to file 
save new_filename 

endfor 

답변

1

save new_filename은 파일 이름이 "new_filename"인 파일에 현재 작업 공간을 저장합니다.

"나는 필요로하지 않는 모든을 삭제하고 전체 작업 공간을 저장"의 현재 접근 방식은 매우 IMHO입니다
save (new_filename); 

: 나는 당신이 원하는 것은 "NEW_FILENAME"에 저장되어있는 파일 이름으로 파일을 작성하는 것입니다 생각 추한이 유일한 부품 료를 경우 대신 명시 적으로 ex_data를 저장해야 원하는 :

save (new_filename, "ex_data"); 
+0

나는이 방법이 못생긴 것을 알고,하지만 난 명시 적으로 각 루프 동안 "ex_data"를 저장 한 경우 각각 다르게 때문에 이름 지정 충돌이있을 것이다 저장된 파일 "new_filename"에는 "ex_data"라는 데이터가 포함됩니다. 그런 다음 두 개 이상의 파일을로드하려는 경우로드 된 각 파일은 바로 앞에있는 파일에서로드 한 데이터 "ex_data"를 덮어 씁니다. 물론, 나는 내 문제에 대한보다 우아한 해결책에 열려있다. – babelproofreader

+0

@babelproofreader 그렇다면 (항상 나는 이것을 선호한다)'d = load ("yourfilename")'파일을 구조체'd'에로드하고'd.ex_data'를 사용하여 액세스 할 수있다. – Andy

+1

@babelproofreader btw, 이 답변 (첫 번째 부분)이 문제를 해결하지 못합니까? 만약 당신이 [MCVE] (https://stackoverflow.com/help/mcve)를 써야만한다. (당신의 코드가 최소한이 아니며 검증 가능하지 않다.) – Andy

관련 문제