初学GAMS,记录一下GAMS从Excel中读取数据的过程,有很多细节需要尝试才能发现问题,希望以通俗的文字记录一下我遇到的问题。
基本概念
GAMS从Excel中提取数据的基本逻辑是通过Gdxxrw的内置命令,将.xlxs文件转换成.gdx文件,再用GAMS读取.gdx文件,根据所设定的参数名和提取区域获得所需数据。
一维&二维矩阵读取步骤
假设我需要读取三个参数line,ebus和Pload,各自的索引集合定义如下:
sets
i 电网节点 /1*24/
eline 电网支路 /1*25/
line_index /from,to,x/
t /1*24/
ebus_index /if_tra,if_gfu1,if_gfu2,if_ptg,ra_pload/
z Pload /PL/;
在导入数据前先定义参数:
Parameters
line(eline,line_index),ebus(i,ebus_index),Pload(t,z);
注意GAMS中定义最后要加分号!
接着进行读取,这里data文件地址需要写完整,路径里面不要中文,否则无法识别。
$call gdxxrw ..\data.xlsx output=..\data.gdx par=line rng=sheet1!A1:D26 Rdim=1 Cdim=1 par=ebus rng=sheet1!F1:K25 par=Pload rng=sheet1!A28:B52
$gdxin ..\data.gdx
$load line ebus Pload
$gdxin
代码解释:
- gdxxrw :GAMS内置的命令,用来读写数据;
- data.xlsx output= data.gdx:表示将你的xlsx文件先转成gdx文件;
- par=line rng=A1:D26 :对象是参数line,元素范围是Excel中的A1:D24;
- rdim=1 cdim=1:rdim规定了某一行是索引,cdim规定了某一列是索引。这里我们存储的excel是有行列表头的(如下图),所以都规定为1。因此在上面规定读取元素范围的时候需要把表头也包括进去,行数要往前一行。
- $ gdxin data.gdx:$gdxin + 文件名表示指定要读取的gdx文件;
- $load line ebus Pload:从gdx文件中读取所需的参数;
- $gdxin:后面没有文件名,表示关闭当前gdx文件
注意:由于本程序的索引使用了字符集合(例如line的索引有from to x),经过实验,excel表的表头也必须和索引完全一致否则无法成功读取。
最后,成功运行完之后,生成的.dgx文件可以通过gams打开,出现以下表格。同时右侧可以看到表格形式的所读取数据。Entry表示读取的顺序,Dim表示维数,Nr Elem表示元素的行数。
基本上到这里我就成功读取了所需要的数据。