2011-03-13 57 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