Как импортировать данные из нескольких листов Excel в GAMS с помощью циклов?

Я хочу импортировать данные для трехмерного параметра p(i,j,k), который хранится в k листах Excel, но GAMS не позволяет мне использовать операторы управления долларом в циклах. Есть ли способ сделать это, используя циклы или другие операторы управления потоком, такие как «для» или «пока»?

Мне нужно сделать что-то вроде этого, но это кажется невозможным:

loop(k,
$call gdxxrw Data.xlsx par=temp rng=k!A1:Z20 rdim=1 cdim=1
$gdxin Data.gdx
$load temp
$gdxin
p(i,j,k)=temp(i,j);
);

person Saeed Rastegar    schedule 27.05.2016    source источник
comment
Пожалуйста, опубликуйте свой код   -  person Dinidu Hewage    schedule 27.05.2016


Ответы (1)


Предположим, что каждый лист выглядит так:

введите здесь описание изображения

(разница только в том, что я использую 2 на листе 2 и 3 на листе 3).

Чтобы прочитать это, выполните:

$set xls  d:\tmp\test2.xlsx
$set gdx  s.gdx

set
  i /i1*i3/
  j /j1*j5/
  k 'sheet names' /Sheet1*Sheet3/
;

parameter
  s(i,j)  'single sheet'
  a(i,j,k)  'all data'
;

file f /task.txt/;
loop(k,
  putclose f,'par=s rng=',k.tl:0,'!a1 rdim=1 cdim=1'/
  execute 'gdxxrw i=%xls% o=%gdx%  @task.txt trace=2';
  execute_loaddc '%gdx%',s;
  a(i,j,k) = s(i,j);
);

display a;

Мои результаты:

----     23 PARAMETER a  all data

           sheet1      sheet2      sheet3

i1.j1       1.000       2.000       3.000
i1.j2       1.000       2.000       3.000
i1.j3       1.000       2.000       3.000
i1.j4       1.000       2.000       3.000
i1.j5       1.000       2.000       3.000
i2.j1       1.000       2.000       3.000
i2.j2       1.000       2.000       3.000
i2.j3       1.000       2.000       3.000
i2.j4       1.000       2.000       3.000
i2.j5       1.000       2.000       3.000
i3.j1       1.000       2.000       3.000
i3.j2       1.000       2.000       3.000
i3.j3       1.000       2.000       3.000
i3.j4       1.000       2.000       3.000
i3.j5       1.000       2.000       3.000
person Erwin Kalvelagen    schedule 27.05.2016