我正在为一个问题编写测试用例,我想用Mathematica检查我的测试用例但是我遇到了文件输入/输出的一些问题。
我必须从文件中输入“Test.in”,日期由每行中的一个整数/字符串组成,输入由EOF终止,我必须输入(每行一个,一个在一个我必须在每个步骤中处理输入和输出到文件说“output.out”。我们如何在Mathematica中做到这一点?
PS:我正在使用Mathematica 7.0
增加:
Test.in的示例就像this。
答案 0 :(得分:4)
您要求阅读(每行一次)。嗯,这肯定不是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-ish这样做的方法,但这通常意味着不要一次阅读一个,因为Mathematica赞成功能,列表 - 广泛的编程而不是迭代的方式。
答案 1 :(得分:2)
一次读取每个值是相当笨重的,但是在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 vs Sow / Reap的Jon McLoone: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]可能是很多评论良好的代码。
注意:我使用http://ideone.com/fM0rs下载链接将您的数据下载到本地文件ideone_fM0rs.txt
答案 2 :(得分:0)
这很简单,就像Mathematica中的所有内容一样,有不止一种方法可以做到。就个人而言,我会使用
data = ReadList["Test.in", Number, RecordLists-> True];
然后使用Map
处理data
。还有Import
,您的数据可能最好加载为Table
类型,但您可以查看full list并查看其中的内容。您也可以使用Read
,但您必须自己控制文件打开/关闭。
答案 3 :(得分:0)
对于输入方面,这可能会给你一个开始。
vals = Import["http://ideone.com/fM0rs",
"Table"] /. {aa_ /; ! NumberQ[aa] && FreeQ[aa, List], ___} :>
Sequence[] /. {} :> Sequence[]
我认为这个论坛上的其他人可能有更好的方法来解决这个问题;我对入口/出口领域并不熟悉。
Daniel Lichtblau Wolfram Research