Ввод-вывод файла в Mathematica - PullRequest
0 голосов
/ 13 марта 2011

Я пишу тестовые случаи для проблемы, я хочу проверить свои тестовые случаи с Mathematica, но я сталкиваюсь с некоторыми проблемами с вводом / выводом файла.

Я должен принять Ввод из файла скажем«Test.in», дата состоит из Integer / String в каждой строке, а ввод завершается EOF, я должен принять ввод (каждую строку, по одной за раз), и на каждом шаге я должен обработать вводи вывод в файл с именем «output.out». Как мы можем сделать это в Mathematica?

PS: я использую Mathematica 7.0

ADDED:

ОбразецTest.in будет выглядеть как this .

Ответы [ 4 ]

4 голосов
/ 13 марта 2011

Вы попросили прочитать (каждая строка, по одной за раз) .Что ж, это, конечно, не Mathematica способ делать вещи, но, как вы просили об этом, попробуйте что-то вроде:

strInp = OpenRead  ["Test.in"];
strOut = OpenWrite ["Test.out"];

While[(str=Read[strInp, Number) != EndOfFile,

     out = yourprocess[str];

     Write [strOut,out];
];

Close [strOut];
Close [strInp];

(* Now show the output file *)
FilePrint ["Test.out]

Редактировать Другие ответы опубликованы лучше и больше Mathematicaиные способы сделать это, но это, как правило, подразумевает НЕ чтение по одному , поскольку Mathematica предпочитает функциональное программирование по списку, а не итеративный способ.

2 голосов
/ 13 марта 2011

Довольно неуклюже читать каждое значение по одному, но в M- естественно читать их все сразу, а затем обрабатывать каждое.

Вот простая инфраструктура, которую я все время использую:

(* step one: get data *)
data = Import["ideone_fM0rs.txt", "Lines"];

(* step two: ??? *)
res = {};
Module[{value, result},
  value = #;
  result = yourCodeHere[value];
  AppendTo[res, result];
]& /@ data;

(* step three: PROFIT! *)
Export["out.txt", res, "Lines"];

, но см. Джон МакЛоун в AppendTo против Sow / Reap для больших наборов данных: http://blog.wolfram.com/2011/12/07/10-tips-for-writing-fast-mathematica-code.

Вот вариант с Sow / Reap для случаев, когда вы хотите собирать значения по различным тегам, категориям, родам или как угодно:

data = Import["ideone_fM0rs.txt", "Lines"];

res = Reap[Module[{value, result, tag},
  value = #;
  result = yourCodeHere[value];
  tag = generateTag[value]
  Sow[result, tag];
]& /@ data, _, Rule][[2]];

Export["out.txt", res, "Lines"];

Соблазнительно свернуть все это в одновдохновляющая однострочность, но для удобства сопровождения мне нравится держать ее развернутой с каждым явным шагом.

Конечно, вместо yourCodeHere [value] может быть много строк хорошо прокомментированного кода.

Примечание: я загрузил ваши данные в локальный файл ideone_fM0rs.txt, используя ссылку для скачивания на http://ideone.com/fM0rs

0 голосов
/ 13 марта 2011

Для входного аспекта это может дать вам начало.

vals = Import["http://ideone.com/fM0rs", 
  "Table"] /. {aa_ /; ! NumberQ[aa] && FreeQ[aa, List], ___} :> 
  Sequence[] /. {} :> Sequence[]

Я думаю, у других на этом форуме могут быть лучшие способы сделать это; Я не очень разбираюсь в сфере импорта / экспорта.

Даниэль Лихтблау Wolfram Research

0 голосов
/ 13 марта 2011

Это просто сделать, и, как и все в Mathematica, есть несколько способов сделать это. Лично я бы использовал

data = ReadList["Test.in", Number, RecordLists-> True];

, а затем обработайте data, используя Map. Также есть Import, и ваши данные, вероятно, лучше всего загружать как тип Table, хотя вы можете проверить полный список и посмотреть, что там. Вы также можете использовать Read, но вам придется самостоятельно контролировать / открывать / закрывать файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...