2011-03-13 59 views
0

我正在为一个问题编写测试用例,我想用Mathematica检查我的测试用例,但是我遇到了一些文件输入/输出问题。Mathematica中的文件输入输出

我必须从文件中输入“Test.in”,日期由每行中的整数/字符串组成,并且输入由EOF终止,我必须接受输入(每行一个一个时间),并且在每个步骤中,我必须处理输入和输出到一个文件,如“output.out”。我们如何在Mathematica中做到这一点?

PS:我使用Mathematica 7.0

新增:

Test.in的样品会像this

+0

发布“Test.in” – 2011-03-13 01:21:45

回答

4

您要求阅读(每行,每次一行)。嗯,这是肯定不会做的事情的数学方法,但你自找的,尝试沿着线的东西:其他答案贴出这样做的更好,更数学十岁上下的方式

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倾向于功能性,列表范围的编程而不是迭代方式。

+0

单NIT的一部分:如果你'Abort'你不清理。您需要将其包装在'CheckAbort'中,否则文件将保持打开状态。 – rcollyer 2011-03-14 03:21:40

+1

@rcollyer我总是试图从Mma的这种处理中飞走。文件管理不够健壮。我看到腐败文件和检查点管理非常难以实施。我想更好的方法不是使这种方法健壮,而是切换到最自然的方式(所有文件都在一个glup中)。 – 2011-03-14 03:29:13

+0

有时你不能,所以我有一个实用函数(http://stackoverflow.com/questions/4174791/preventing-avalanche-of-runtime-errors-in-mathematica/4176381#4176381),它包装文件处理'CheckAbort'对我来说,叫做Execute Around Code或RAII模式。保存我的培根。我通常不写,但我已经得到了可以做的代码。尽管如此,如果我在中途中止,可以这么说,对于文件的写入,不能保证文件的状态。 – rcollyer 2011-03-14 04:46:23

0

这很简单,像Mathematica中的所有内容一样,有多种方法可以实现。就个人而言,我会使用

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

,然后使用Map处理data。也有Import和您的数据可能是最好的加载类型Table,虽然你可以检查full list,看看有什么。你也可以使用Read,但你必须控制自己打开/关闭文件。

0

对于输入方面,这可能会给你一个开始。

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

我认为在这个论坛上的其他人可能有更好的方式去了解它;我对输入/输出领域不太熟悉。

丹尼尔Lichtblau 沃尔夫勒姆研究

+0

返回的Length @ vals是397,OP发布了一个包含200条记录的文件。你也在阅读“行号”,但是它应该给出400的长度:( – 2011-03-13 02:01:14

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母猪/粒大数据集:http://blog.wolfram.com/2011/12/07/10-tips-for-writing-fast-mathematica-code

下面是与母猪的变化/粒的时候,你想收集下的各种标签或类别或种种质或任何值:

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"]; 

人们很容易滚所有成一个单一的awe-鼓舞人心的单线程,但为了可维护性,我喜欢在每一步明确的时候保持它的展开。

当然,yourCodeHere [value]可以代替许多注释良好的代码。

注:我下载您的数据,使用的下载链接本地文件ideone_fM0rs.txthttp://ideone.com/fM0rs

+1

“把所有这些都变成单一的令人敬畏的单行记录是很诱人的”是不是总是...... – acl 2011-03-13 12:22:00