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

Във версия 33.2.0 на GAMS променям точката и запетаята на запетаи в 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