diff --git a/doc/dynare.texi b/doc/dynare.texi index c50d9f75acb47b65c831b265910023c57831ac9e..d1444b7409e09f2dd6d9ee1ba4d23b581a97a29c 100644 --- a/doc/dynare.texi +++ b/doc/dynare.texi @@ -1993,9 +1993,10 @@ variable, the file must contain a row vector of the same name. MAT-file (extension @file{.mat}): same as for M-files. @item -Excel file (extension @file{.xls}): for each endogenous and exogenous, -the file must contain a column of the same name (supported under Octave -if the @uref{http://octave.sourceforge.net/io/,io} and +Excel file (extension @file{.xls} or @file{.xlsx}): for each +endogenous and exogenous, the file must contain a column of the same +name (supported under Octave if the +@uref{http://octave.sourceforge.net/io/,io} and @uref{http://octave.sourceforge.net/java/,java} packages from Octave-Forge are installed, along with a @uref{http://www.java.com/download,Java Runtime Environment}). @@ -3891,7 +3892,7 @@ graphs of smoothed shocks, smoothed observation errors, smoothed and historical @item datafile = @var{FILENAME} @anchor{datafile} The datafile: a @file{.m} file, a @file{.mat} file or, a -@file{.xls} file (the latter format is supported under Octave +@file{.xls}/@file{.xlsx} file (the latter format is supported under Octave if the @uref{http://octave.sourceforge.net/io/,io} and @uref{http://octave.sourceforge.net/java/,java} packages from Octave-Forge are installed, along with a diff --git a/matlab/global_initialization.m b/matlab/global_initialization.m index 371320c7f1516af9e437df1460d80412a49fc82e..82345b4d8183330afda5f8f235a82e1e401a2579 100644 --- a/matlab/global_initialization.m +++ b/matlab/global_initialization.m @@ -227,7 +227,7 @@ options_.particle = particle; options_.TeX = 0; % Exel -options_.xls_sheet = ''; +options_.xls_sheet = 1; % Octave does not support the empty string, rather use first sheet options_.xls_range = ''; % Prior draws diff --git a/matlab/initvalf.m b/matlab/initvalf.m index 72d340c4e23209632589e482124b5c4f248fd4cc..13e1005d7ba6fcbe5198c17da956802a46b028ad 100644 --- a/matlab/initvalf.m +++ b/matlab/initvalf.m @@ -13,7 +13,7 @@ function initvalf(fname_) % All variables local to this function have an underscore appended to % their name, to minimize clashes with model variables loaded by this function. -% Copyright (C) 2003-2010 Dynare Team +% Copyright (C) 2003-2012 Dynare Team % % This file is part of Dynare. % @@ -33,13 +33,39 @@ function initvalf(fname_) global M_ oo_ options_ series_ = 1; -if exist(fname_) == 2 - eval(fname_); -elseif exist([fname_ '.xls']) == 2 - [data_,names_v_]=xlsread([fname_ '.xls']); - series_ = 0; -elseif exist([fname_ '.mat']) == 2 - load(fname_); + +[directory,basename,extension] = fileparts(fname_); + +% Auto-detect extension if not provided +if isempty(extension) + if exist([basename '.m'],'file') + extension = '.m'; + elseif exist([basename '.mat'],'file') + extension = '.mat'; + elseif exist([basename '.xls'],'file') + extension = '.xls'; + elseif exist([basename '.xlsx'],'file') + extension = '.xlsx'; + else + error(['Can''t find datafile: ' basename '.{m,mat,xls,xlsx}']); + end +end + +fullname = [basename extension]; + +if ~exist(fullname) + error(['Can''t find datafile: ' fullname ]); +end + +switch (extension) + case '.m' + eval(basename); + case '.mat' + load(basename); + case { '.xls', '.xlsx' } + [data_,names_v_]=xlsread(fullname); % Octave needs the extension explicitly + otherwise + error(['Unsupported extension for datafile: ' extension]) end options_.initval_file = 1; diff --git a/matlab/read_variables.m b/matlab/read_variables.m index c313a031e3e12b8a5c117e1999a439db6bbcbabd..280cfa20144a2951441e6a4683f8c7dfc4e9329e 100644 --- a/matlab/read_variables.m +++ b/matlab/read_variables.m @@ -17,7 +17,7 @@ function dyn_data_01=read_variables(file_name_01,var_names_01,dyn_data_01,xls_sh % all local variables have complicated names in order to avoid name % conflicts with possible user variable names -% Copyright (C) 2005-2011 Dynare Team +% Copyright (C) 2005-2012 Dynare Team % % This file is part of Dynare. % @@ -36,53 +36,72 @@ function dyn_data_01=read_variables(file_name_01,var_names_01,dyn_data_01,xls_sh old_pwd = pwd; -[path_name_02,file_name_02,ext_name_02] = fileparts(file_name_01); -if ~isempty(path_name_02) - file_name_01 = [file_name_02, ext_name_02]; - cd(path_name_02) +[directory,basename,extension] = fileparts(file_name_01); +if ~isempty(directory) + cd(directory) end dyn_size_01 = size(dyn_data_01,1); var_size_01 = size(var_names_01,1); -if exist([file_name_01 '.m'],'file') - file_name_02 = [file_name_01 '.m']; - dyn_instr_01 = file_name_01; - eval(dyn_instr_01); - for dyn_i_01=1:var_size_01 - dyn_tmp_01 = eval(var_names_01(dyn_i_01,:)); - if length(dyn_tmp_01) > dyn_size_01 && dyn_size_01 > 0 - cd(old_pwd) - error('data size is too large') - end - dyn_data_01(:,dyn_i_01) = dyn_tmp_01; + +% Auto-detect extension if not provided +if isempty(extension) + if exist([basename '.m'],'file') + extension = '.m'; + elseif exist([basename '.mat'],'file') + extension = '.mat'; + elseif exist([basename '.xls'],'file') + extension = '.xls'; + elseif exist([basename '.xlsx'],'file') + extension = '.xlsx'; + else + error(['Can''t find datafile: ' basename '.{m,mat,xls,xlsx}']); end -elseif exist([file_name_01 '.mat'],'file') - file_name_02 = [file_name_01 '.mat']; - s = load(file_name_01); - for dyn_i_01=1:var_size_01 - dyn_tmp_01 = s.(deblank(var_names_01(dyn_i_01,:))); - if length(dyn_tmp_01) > dyn_size_01 && dyn_size_01 > 0 - cd(old_pwd) - error('data size is too large') +end + +fullname = [basename extension]; + +if ~exist(fullname) + error(['Can''t find datafile: ' fullname ]); +end + +switch (extension) + case '.m' + eval(basename); + for dyn_i_01=1:var_size_01 + dyn_tmp_01 = eval(var_names_01(dyn_i_01,:)); + if length(dyn_tmp_01) > dyn_size_01 && dyn_size_01 > 0 + cd(old_pwd) + error('data size is too large') + end + dyn_data_01(:,dyn_i_01) = dyn_tmp_01; end - dyn_data_01(:,dyn_i_01) = dyn_tmp_01; - end -elseif exist([file_name_01 '.xls'],'file') - file_name_02 = [file_name_01 '.xls']; - [num,txt,raw] = xlsread(file_name_01,xls_sheet,xls_range); - for dyn_i_01=1:var_size_01 - iv = strmatch(var_names_01(dyn_i_01,:),raw(1,:),'exact'); - dyn_tmp_01 = [raw{2:end,iv}]'; - if length(dyn_tmp_01) > dyn_size_01 && dyn_size_01 > 0 - cd(old_pwd) - error('data size is too large') + case '.mat' + s = load(basename); + for dyn_i_01=1:var_size_01 + dyn_tmp_01 = s.(deblank(var_names_01(dyn_i_01,:))); + if length(dyn_tmp_01) > dyn_size_01 && dyn_size_01 > 0 + cd(old_pwd) + error('data size is too large') + end + dyn_data_01(:,dyn_i_01) = dyn_tmp_01; end - dyn_data_01(:,dyn_i_01) = dyn_tmp_01; - end -else - cd(old_pwd) - error(['Can''t find datafile: ' file_name_01 ]); + case { '.xls', '.xlsx' } + [num,txt,raw] = xlsread(fullname,xls_sheet,xls_range); % Octave needs the extension explicitly + for dyn_i_01=1:var_size_01 + iv = strmatch(var_names_01(dyn_i_01,:),raw(1,:),'exact'); + dyn_tmp_01 = [raw{2:end,iv}]'; + if length(dyn_tmp_01) > dyn_size_01 && dyn_size_01 > 0 + cd(old_pwd) + error('data size is too large') + end + dyn_data_01(:,dyn_i_01) = dyn_tmp_01; + end + otherwise + cd(old_pwd) + error(['Unsupported extension for datafile: ' extension]) end + cd(old_pwd) disp(sprintf('Loading %d observations from %s\n',... - size(dyn_data_01,1),file_name_02)) + size(dyn_data_01,1),fullname)) diff --git a/tests/Makefile.am b/tests/Makefile.am index 36bd25f2b0a2709a53a799e7b560cfd42762f3c5..d88af255fce25bedbac35b1a8b7d37fcef976716 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -60,6 +60,7 @@ MODFILES = \ arima/mod2a.mod \ arima/mod2b.mod \ arima/mod2c.mod \ + data/mod1a.mod \ fs2000/fs2000.mod \ fs2000/fs2000a.mod \ fs2000/fs2000c.mod \ @@ -168,6 +169,7 @@ EXTRA_DIST = \ external_function/extFunWithFirstAndSecondDerivs.m \ expectations/expectation_ss_old_steadystate.m \ steady_state/walsh1_old_ss_steadystate.m \ + data/test.xls \ fs2000/fs2000a_steadystate.m \ fs2000/fsdat_simul.m \ k_order_perturbation/run_fs2000kplusplus.m \