Я использую обработчик таблиц ODBC для чтения данных из файлов Excel и CSV в модель AMPL. Но то, с чем я столкнулся, вероятно, не имеет ничего общего с конкретными программами и языком программирования, которые я использую.
Среди данных есть два особых типа строк: трехзначные буквенные и шестизначные буквенно-цифровые.
Когда трехзначный алфавитный тип включает строку NAN
, AMPL выдает ошибку. Как я выяснил, причина в том, что он понимает NAN
как "NaN" (не число). Он не может использовать это как индекс.
Шестизначный буквенно-цифровой тип иногда включает такие строки, как 3E1234
. Это кажется проблемой, потому что AMPL (или обработчик) понимает это как число в экспоненциальном представлении. Таким образом, он читается как 3*10^1234
, что обрабатывается как бесконечность. Поэтому, когда есть одна запись 3E1234
и одна запись 3E1235
, она видит их обе как бесконечность.
Я понимаю этих двоих. И хотя они раздражают, я могу с этим работать. Теперь я столкнулся с тем, что строка SK1234
анализируется как число 1234. Я немного изучил программирование в колледже, но понятия не имею, почему это происходит. Есть ли в префиксе SK
что-то особенное?
EDIT: Вот пример, который воспроизводит ошибку:
Файл модели:
set INDEX;
param value;
Файл "Выполнить":
table Table1 IN "tableproxy" "odbc" "DSN=NDE" "Test.csv": INDEX <- [Index], value ~ Value;
read table Table1;
NDE
— это пользовательский DSN, который использует текстовый драйвер Microsoft в соответствующей папке. И файл CSV:
Index,Value
SK1202,1
SK1445,2
SK0124,3
SK7896,4
SK1,5
AB1234,6
После запуска всего этого кода я набираю display INDEX
и получаю
set INDEX := 1202 1445 124 7896 1 Missing;
Таким образом, поле Index
обрабатывается как числовое поле, в котором первые пять записей преобразуются в числа. Последняя запись не может быть преобразована, поэтому она обрабатывается как Missing
.
Настройка DSN заключается в том, что он устанавливает тип в соответствии с первыми 25 строками. По какой-то причине он понимает записи SK...
как числа и поэтому читает все как числа.