Mathcad readprn не работает
БлогNot. Mathcad: как обработать файл со смешанными числовыми и строковыми данными?
Mathcad: как обработать файл со смешанными числовыми и строковыми данными?
Чтение и обработка матрицы или вектора из текстового файла в Mathcad выглядят довольно просто:
- Функция READPRN(«имя файла») возвращает матрицу, в которой каждая строка определяется записью (строкой) файла. Количество элементов (числовых значений) в каждой строке файла должно быть одинаковым. Используется в виде A:= READPRN(«имя файла») , где A — массив;
- Функция WRITEPRN(«имя файла») записывает матрицу в файл данных. Каждая строка матрицы становится записью файла. Используется в виде WRITEPRN(«имя файла»):=A , где A — массив;
- Функция APPENDPRN(«имя файла») дописывает матрицу к существующему файлу. Используется в виде APPENDPRN(«имя файла»):=A . Существующий файл должен иметь столько же столбцов, что и массив A .
Эти функции предназначены для работы со структурированным файлом данных, то есть, файлом, содержащим числа, расположенные по строкам и столбцам. Как частный случай, файл может содержать одну строку или один столбец с числами, то есть, быть вектор-строкой или вектор-столбцом.
В качестве практического примера решим такую задачку:
В файле содержится матрица оценок N студентов по M предметам, N>1, M>0 . Прочитать данные и вычислить следующие величины:
- средний балл по каждому предмету и каждому студенту;
- общий средний балл группы;
- количество оценок «2», «3», «4» и «5».
Если исходные данные сохранены в файле data.txt вида
то полный код решения выглядит так:
Если файл «неправильный», то есть, не содержит одинаковое количество числовых значений в каждой строке, то функция READPRN его не прочитает. Дополнительно мы проверяем, содержатся ли в файле допустимые оценки (то есть, значения 2, 3, 4 или 5) с помощью переменной Check .
Результаты пишутся в файл result.txt текущей папки, вот что там вышло:
Нижний правый ноль пришлось добавить, чтобы APPENDPRN не отказывалась дописывать в файл вектор-строку со средними баллами по трём предметам.
Чтобы этот код заработал, нужно выполнение 3 условий:
- документ MathCAD был хотя бы раз сохранен;
- текстовый файл data.txt был сохранен в той же папке, что и документ MathCAD;
- в текстовом файле содержатся только числовые значения, причём, их количество в каждой строке файла одинаково (количество пробелов или табуляций между значениями в одной строке не имеет значения).
Что в нашем решении оказалось неудобно? Прежде всего то, что студенты из списка отличаются между собой только по номерам. Можно ли сделать так, чтобы Mathcad читал нормальный текстовый файл с текстом и числами, да ещё и позволял иметь разное количество разделителей в строках и разное количество чисел в одной строке?
Для решения такой задачи удобно использовать панель программирования и функцию READCSV , предназначенную для чтения произвольных текстовых данных.
Функция доступна в Mathcad версии 15
Правда, при «ручной» обработке данных нам придётся проделать подготовительную работу по «чистке» и парсингу прочитанных из файла строк.
Подготовим следующие функции:
- char(s,i) — извлечение из строки s символа с допустимым номером i ;
- isdiv(s) — проверяет, является ли односимвольная строка s разделителем, то есть, пробелом, табуляцией или переводом строки. Возвращает 0 или 1;
- trimstr(s) — удаляет лишние разделители в начале, конце строки, а также между лексемами. Возвращает строку из лексем, разделённых одним пробелом.
Значение системной настройки ORIGIN предполагается равным нулю (по умолчанию), опция Тооls — Worksheet options — Calculations — Use ORIGIN to string indexing не установлена, то есть, строки индексируются всегда с нуля независимо от значения ORIGIN , это тоже принято по умолчанию.
Теперь мы готовы написать функцию, которая парсит матрицу из одного столбца, содержащую записи следующего вида (файл test.txt ):
Функция предполагает, что первая из оставшихся после обработки trimstr в очередной строке лексема является строкой, попадающей в массив Names , а остальные лексемы — числовые значения, записываемые в матрицу Balls .
Существенно, что эту функцию не должны смущать не-число в данных Balls (в соответствующую позицию матрицы запишется ноль, см. оператор on error ) или разное количество чисел в строке (Mathcad автоматически «расширит» матрицу, заполняя свободные столбцы нулями).
Текстовый файл test.txt сохранён в кодировке Юникод (UTF-8), в этом случае мой новенький Mathcad 15 M045 прочитал символы кириллицы без проблем.
Остаётся проверить, что получилось, а дальше использовать массивы Names и Balls по своему усмотрению, например, как в предыдущей задаче.
P.S. Весь наш длинный код следует рассматривать, конечно, как учебный. Реально мы могли бы, настроив чтение функцией READCSV, решить задачу в 3 строчки кода:
Файл list.txt содержал лишние разделители, будучи таким:
Если файл сохранён из Блокнота, выбрать при сохранении кодировку Юникод или UTF-8, метка BOM Mathcad’у помешать не должна. Также функцию не смутят «недостающие» числа в данных, в нашем случае она заменит их нулями.
Источник
Mathcad readprn не работает
В этом разделе обсуждается использование функций READPRN, WRITEPRN и APPENDPRN для работы со структурированными файлами. Структурированный файл данных — файл с фиксированным числом значений на строке. Например, если экспортировать прямоугольную область из электронной таблицы в текстовый файл, возникающие в результате строки и столбцы чисел сформируют структурированный файл.
Считывание матрицы с помощью функции READPRN
Предположим, что имеется ASCII-файл, содержащий данные, показанные ниже. Эти данные могут быть взяты из электронной таблицы или из любого другого источника.
Рисунок 4 показывает документ Mathcad, который считывает эти данные в матрицу.
Функция READPRN читает весь файл данных, определяет число строк и столбцов, и создает матрицу из этих данных.
Когда Mathcad читает данные с помощью функции READPRN:
- Каждый раз READPRN читает файл данных целиком.
- Все строки в файле данных должны содержать одинаковое количество значений. (Строки, не содержащие значений, игнорируются). Если строки в файле имеют различное число значений, Mathcad, отмечает функцию READPRN сообщением “ошибка файла”.
- Функция READPRN игнорирует текст в файле данных.
- Результатом чтения файла данных является m-на-n матрица, где m есть число строк, содержащих данные в файле, и n есть число значений в строке. Чтобы создать матрицу из значений в файле данных, используйте равенство, подобное M: = READPRN(file). Не используйте нижние индексы дляM. Функция READPRN возвращает матрицу, поэтому нижние индексы излишни.
- Чтобы читать из файла с именем, которое не совпадает с именем файловой переменной, либо из файла, находящегося не в каталоге по умолчанию, выберите Присоединить к файлу из меню Файл. Подробнее см. раздел “Импортирование данных из других каталогов”.
Предупреждение: Каждая строка в файле данных должна содержать одинаковое число значений. Если оставить промежутки там, где Mathcad ожидает значение, функция READPRN не сможет прочитать файл. Mathcad определяет конец одного и начало следующего значения, ища пробелы или запятые.
Иногда каждый столбец значений в файле данных представляет отдельную переменную. Рисунок 5 показывает, как использовать верхние индексы, чтобы создать вектор из каждого столбца в файле данных.
Рисунок 4: Считывание таблицы данных в матрицу.
Рисунок 5: Присваивание различным переменным значений из разных столбцов в файле данных.
Рисунок 6: Запись данных в структурированный файл данных.
Запись данных при помощи функций WRITEPRN и APPENDPRN
Рисунок 6 показывает, как использовать функцию WRITEPRN, чтобы записать данные в структурированный файл данных.
Когда Mathcad обрабатывает документ из Рисунка 6, создается файл данных, содержащий следующие значения:
В отличие от WRITE функция WRITEPRN записывает данные в виде столбцов. Обратите внимание, что, поскольку для PRNPRECISION установлено значение четыре, числа записаны с четырьмя знаками после запятой. Поскольку значение PRNCOLWIDTH равно восьми, каждый столбец имеет ширину в восемь символов. Так как PRNPRECISION и PRNCOLWIDTH могут изменяться независимо, нужно не упустить из виду, что ширина столбца должна быть такой, чтобы разместились все необходимые цифры вместе с пробелом, разделяющим отдельные значения.
Когда используется функция WRITEPRN:
- Равенства, содержащие WRITEPRN, должны быть следующего вида. Слева записывается WRITEPRN( file), где file — имя файловой переменной, затем следует символ определения (:=) и выражение, возвращающее матрицу. Не используйте дискретные аргументы или нижние индексы с WRITEPRN .
- Каждое новое равенство записывает новый файл. Если два равенства пишут в один файл, данные, написанные вторым равенством уничтожат данные, написанные первым. Используйте APPENDPRN, если нужно дописать значения к файлу вместо того, чтобы перезаписать файл. APPENDPRN function
- Встроенные переменные PRNCOLWIDTH и PRNPRECISION определяют формат файла данных, создаваемого Mathcad. Текущее значение PRNCOLWIDTH определяет ширину столбцов (в символах). Текущее значение PRNPRECISION определяет число используемых значащих цифр. По умолчанию PRNCOLWIDTH = 8 и PRNPRECISION = 4. Чтобы изменить эти значения, выберите Встроенные переменные из меню Математика или поместите соответствующие определения в документ Mathcad выше места использования WRITEPRN, как показано на Рисунке 7.
- Если записываемый массив является составным (чьи элементы являются сами массивами), либо комплекснозначным, то тогда WRITEPRN создаст не просто ASCII-файл, а файл специального формата, который навряд ли будет читаем другими прикладными программами. Этот файл может, однако, читаться функцией READPRN.
Рисунок 7: Документ, который создаёт файл данных со столбцами шириной в 10 символов, содержащий числа с 5 значащими цифрами.
Используя функцию augment, можно объединять отдельные переменные в массивы, и записывать их все в файл данных. Рисунок 8 показывает, как это делать.
Рисунок 8: Запись нескольких векторов, объединённых вместе.
Преимущества использования READPRN и WRITEPRN
Использование READPRN, как правило, предпочтительнее использования READ. Когда данные структурированы в столбцы, READPRN переводит данные в Mathcad в легкодоступной форме.
Если некоторые строки в файле данных имеют большее количество значений, чем другие, данные могут быть потеряны. Используйте текстовый редактор, чтобы заменить пропущенные значения на нули перед использованием READPRN.
Функция READ используется для файлов, в которых значения одной переменной разбросаны по нескольким строкам. Таковы файлы, созданные WRITE, которая располагает столько чисел на строке, сколько строка может вместить.
Помните: используйте нижний индекс, являющийся дискретным аргументом, чтобы читать с помощью READ; не используйте нижний индекс, чтобы читать с помощью READPRN.
Обычно WRITEPRN производит более читаемые файлы, чем WRITE, поскольку данные в них аккуратно расположены в строках и столбцах. С другой стороны, WRITE производит меньшие файлы, чем WRITEPRN, потому что ей не нужно добавлять пробелы для выравнивания данных.
Используйте WRITE вместо WRITEPRN, когда требуется напихать так много значений, сколько возможно, в малый файл данных.
Исправляем ошибки: Нашли опечатку? Выделите ее мышкой и нажмите Ctrl+Enter
Источник
Mathcad readprn не работает
Файл данных Mathcad должен быть просто файлом в ASCII формате. Mathcad читает файлы, которые состоят из чисел, отделяемых запятыми, пробелами или возвратами каретки. Ниже описаны примеры некоторых файлов, которые Mathcad может читать, в предположении, что они записаны в ASCII формате:
- Файл, содержащий экспериментальные данные, фиксируемые аппаратными средствами и программным обеспечением сбора данных.
- Файл, созданный выводом данных из электронной таблицы на диск.
- Столбец чисел, набитых в текстовом процессоре и сохраненных в ASCII формате.
- Результат работы программы, написанной на языке БЕЙСИК.
- Данные, экспортированные из базы данных.
Числа в файлах данных могут быть целыми числами, подобными 3 или -1, числами с плавающей запятой, подобными 2.54, или иметь экспоненциальную запись, как 4.51E -4 (для 4.5
200, 50 25.1256, 16E – 2, – 16.125E15
Mathcad также сохраняет данные в ASCII файлы. Файлы данных, сохранённые Mathcad, содержат числа, отделяемые пробелами и возвратами каретки. Обратите внимание: документы Mathcad сами по себе не являются файлами данных в указанном понимании. Единственный способ создать файл данных из Mathcad — использование функций доступа к файлам, описанное в этой главе.
Функции доступа к файлам
В Mathcad есть шесть функций доступа к файлам READ, WRITE, APPEND, READPRN, WRITEPRN e APPENDPRN. Их свойства:
- Имя функции должно печататься заглавными буквами. Можно также использовать пункт Вставить функцию меню Математика, чтобы перенести имя функции из раскрывающегося списка двойным щелчком мыши. Insert Function command
- Если Mathcad не может найти файл данных, он отмечает соответствующую функцию доступа сообщением об ошибке “файл не найден”. Если Mathcad пытается прочитать файл неподходящего формата, он отмечает функцию сообщением “ошибка файла”.
- Левая часть оператора присваивания, использующего одну из функций WRITE, APPEND, WRITEPRN e APPENDPRN, ia должна больше ничего содержать.
- Каждое новое равенство с использованием функций доступа заново открывает файл данных. При считывании данных, например, каждое новое равенство начинает читать в начале файла.
- В одном равенстве файл может быть открыт только единожды. Это означает, что, если функция READ используется с одним аргументом-именем файла дважды в одном уравнении (это возможно при использовании дискретного аргумента), во второй раз READ начнет читать с того места, где закончила в первый. Поскольку READPRN читает весь файл целиком, это означает, что READPRN нельзя использовать с одним аргументом дважды в одном равенстве — во второй раз READPRN не останется ничего читать.
- Если два равенства в рабочем документе используют WRITE или WRITEPRN с одним аргументом, данные из второго равенства запишутся поверх данных из первого. Используйте APPEND или APPENDPRN, если нужно сохранить первую порцию данных. Эти функции дописывают новые данные к существующему файлу.
Таблица ниже описывает эти шесть функций. В этой таблице:
- A обозначает массив (вектор или матрицу).
- v i обозначают отдельные элементы вектора v.
- file — любое допустимое имя переменной Mathcad.
- i — дискретный аргумент.
Функции Read , Write и Append могут использоваться с дискретными аргументами, остальные — нет.
| Функция | Значение |
| READ( file) | Считывает значение из файла данных. Возвращает скаляр. Обычно используется следующим образом: vi :=READ( file) |
| WRITE( file) | Записывает значение в файл данных. Если файл уже существует, заменяет его на новый файл. Должна использоваться в определениях следующего вида: WRITE( file) := vi |
| APPEND( file) | Дописывает значение к существующему файлу. Должна использоваться в определениях следующего вида: APPEND( file) := vi |
| READPRN( file) | Читает структурированный файл данных. Возвращает матрицу. Каждая строка в файле данных становится строкой в матрице. Число элементов в каждой строке должно быть одинаковым. Обычно используется следующим образом: A : = READPRN( file) |
| WRITEPRN( file) | Записывает матрицу в файл данных. Каждая строка матрицы становится строкой в файле. Должна использоваться в определениях следующего вида: WRITEPRN( file) := A |
| APPENDPRN( file) | Дописывает матрицу к существующему файлу. Каждая строка в матрице становится новой строкой в файле данных. Должна использоваться в определениях следующего вида: APPENDPRN( file) := A. Существующий файл должен иметь столько же столбцов, как и матрица A. |
Аргументы функций доступа к файлам
Аргументы всех функций в предыдущей таблице называются файловыми переменными. file variable В отличие от других переменных файловая переменная содержит в себе не числовое значение, а имя файла. За исключением случаев, описанных ниже в разделе “Импортирование данных из других каталогов”, имя файла, соответствующего файловой переменной, есть просто имя этой переменной с расширением .dat или .prn .
Выбор расширения зависит от функции, используемой с файловой переменной. Например, если имя файловой переменной — papageno, и используется READPRN или WRITEPRN, то Mathcad будет работать с файлом, называемом papageno.prn и находящемся в текущем каталоге. Если же использовать READ либо WRITE, Mathcad будет работать с файлом, называемым papageno.dat и находящемся в текущем каталоге.
Можно отменять расширения по умолчанию .dat и .prn, используя в качестве файловой переменной имя файла с расширением. Например, чтобы читать из файла papageno.txt, просто напечатайте имя с раширением в качестве файловой переменной. Точка исчезнет, и появится запись “papagenotxt”.
Будьте внимательны, используя слишком длинные имена файловых переменных. Хотя Mathcad допускает создание длинных имён файловых переменных вроде resistanceparallel, они не могут соответствовать именам файлов, потому что содержат слишком много символов. В этом случае Mathcad ищет файл, чьё имя получается усечением имени файловой переменной. Например, READPRN(resistanceparallel) указывает Mathcad читать из файла с названием resistan.par .
Если файл, с которым нужно работать, размещен в каталоге ином, нежели каталог по умолчанию, нельзя просто напечатать полный путь к файлу между круглыми скобками одной из функций доступа. Дело в том, что функция доступа есть математическое выражение, и в результате Mathcad истолковывает нажатие клавиш \ или : при попытке указать символ дисковода или каталог как указание создать квадратный корень или оператор определения.
Чтобы обойти эту трудность, Mathcad позволяет присвоить имя файла файловой переменной подобно тому, как число присваивается обычной переменной. Эта возможность обсуждена в следующем разделе.
Исправляем ошибки: Нашли опечатку? Выделите ее мышкой и нажмите Ctrl+Enter
Источник