Проблема с переводом символов с tr (POSIX) в GAMS

В GAMS версии 33.2.0 я заменяю точки с запятой на запятые в csv-файле 'file.csv', потому что GAMS требует использования запятых в качестве разделителей. Затем я хочу передать содержимое csv-файла в таблицу в GAMS, а затем сохранить его в gdx-файле. Когда я запускаю приведенный ниже код, точки с запятой успешно заменяются запятыми, но, несмотря на это, GAMS не может составить из них таблицу. Я получаю ошибку 326: за оператором пустой таблицы не следует законный оператор, и ошибка возникает, когда первая запятая встречается в csv-файле 'file_temp.csv'. Почему GAMS не распознает запятую как разделитель?

Файл file.csv содержит:

;col1;col2;col3
row1;1;2;3
row5;4;5;6
row3;7;8;9
row4;10;11;12

Мой код:

Sets
    column /col1, col2, col3/
    row /row1, row2, row3/;
$onempty
$call "tr ; , <file.csv > file_temp.csv"
Table tab(row,column)
$ondelim
$include file_temp.csv
$offdelim
;
$offempty
execute_unload 'tab.gdx'

person sed    schedule 05.02.2021    source источник
comment
Просто догадываюсь, но для оболочки, выполняющей этот вызов, tr ; , совпадает с командой tr, за которой следует команда ,, потому что ; является разделителем команд. Попробуйте tr \; , <file.csv > file_temp.csv или tr ';' , <file.csv > file_temp.csv, чтобы избежать проблемы.   -  person MemReflect    schedule 06.02.2021
comment
@MemReflect Спасибо за ваш комментарий! Я попробовал это сейчас, но это не сработало. Как я уже писал, в файле file_temp.csv вместо точек с запятой в качестве разделителей используются запятые, поэтому перевод работает, но GAMS не воспринимает запятые как разделители, хотя должен ...   -  person sed    schedule 07.02.2021
comment
Так как я никогда не использовал GAMS, моя единственная другая идея - отсутствие row4 и row5 в вашем наборе (или отсутствие row2 в вашем CSV-файле) может быть проблемой. Возможно, тот, кто знаком с программой, сможет больше помочь.   -  person MemReflect    schedule 07.02.2021


Ответы (1)


Когда я запускаю вашу модель, я получаю ошибку нарушения домена. Проблема в том, что вы определили row как row1, row2, row3, в то время как у вас есть row5 в ваших данных. После расширения набора row у меня все заработало:

$onEcho > file.csv
;col1;col2;col3
row1;1;2;3
row5;4;5;6
row3;7;8;9
row4;10;11;12
$offEcho

Sets
    column /col1, col2, col3/
    row /row1 * row5/;
$onempty
$call "tr ; , <file.csv > file_temp.csv"
Table tab(row,column)
$ondelim
$include file_temp.csv
$offdelim
;
$offempty
execute_unload 'tab.gdx';
person Lutz    schedule 08.02.2021
comment
Спасибо, я должен был прочитать свой код, прежде чем размещать здесь. Моя идея заключалась в том, чтобы иметь row1, row2, row3, row4, но тогда, конечно, я должен был назначить установленную строку как / row1, row2, row3 row4 /. Однако это не было причиной того, что за оператором пустой таблицы не следует допущенная ошибка оператора, но я выяснил, что было не так. Я хотел иметь возможность передавать данные из Excel в GAMS, поэтому я должен был упомянуть, что я создал файл file.csv в Excel. Ошибка заключалась в том, что я сохранил его в формате CSV UTF-8, который, похоже, запутал GAMS. Когда я сохранил в виде CSV-файла, все заработало! - person sed; 08.02.2021