2011-03-13 7 views
0

문제에 대한 테스트 케이스를 작성하고 있는데, 테스트 케이스를 Mathematica로 확인하고 싶지만 파일 입출력에 문제가 있습니다.Mathematica에서 파일 입력 출력

"Test.in"이라고하는 파일에서 입력을 가져와야합니다. 날짜는 각 줄의 정수/문자열로 구성되며 입력은 EOF로 끝납니다. 모든 입력은 시간) 그리고 각 단계에서 나는 "output.out"이라고하는 파일에 입력과 출력을 처리해야합니다. 어떻게 Mathematica에서 이것을 할 수 있습니까?

PS : 나는 티카 7.0

을 사용하고

ADDED는 :

Test.in의 샘플은 this처럼 될 것입니다.

+0

http://ideone.com/fM0rs의 다운로드 링크를 사용하여 로컬 파일 ideone_fM0rs.txt에 데이터를 다운로드는 "Test.in" –

답변

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

싱글 니트의 섹션을 게시 : 당신'Abort' 경우 정리하지 않습니다. 'CheckAbort'로 감싸 야합니다. 그렇지 않으면 파일이 열려있을 가능성이 있습니다. – rcollyer

+1

@rcollyer 저는 항상 Mma에서 이런 종류의 처리를 피하려고합니다. 파일 관리만으로는 충분하지 않습니다. 손상된 파일과 검사 점 관리가 구현하기가 매우 어렵다는 것을 알았습니다. 더 나은 방법은이 접근법을 강력하게 만드는 것이 아니라 가장 자연스러운 방법 (모든 파일을 한 번에)으로 전환하는 것입니다. –

+0

가끔은 그렇게 할 수 없으므로 파일 처리를 감싸는 유틸리티 함수 (http://stackoverflow.com/questions/4174791/preventing-avalanche-of-runtime-errors-in-mathematica/4176381#4176381)가 있습니다. 나를 위해'CheckAbort', 코드 주위 실행 또는 RAII 패턴 중 하나라고합니다. 내 베이컨을 구해 줬어. 나는 보통 글을 쓰지 않지만, 코드를 일반화 시켜서 할 수있다. 비록 쓰기와 함께, 내가 중도를 중단한다면, 파일의 상태에 대해서는 아무런 보장이 없다. – rcollyer

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[] 

다른 사람들이이 포럼의 다른 사람들에게 더 좋은 방법이 있다고 생각합니다. 나는 Import/Export 영역에별로 정통하지 않습니다.

다니엘 Lichtblau 볼프람 연구

+0

반환 된 Length @ vals는 397이며 OP는 200 개의 레코드가있는 파일을 게시했습니다. 당신도 "줄 번호"를 읽고 있지만 길이는 400을 부여해야합니다 : ( –

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에 존 McLoone를 참조하십시오 : 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-에 모든 것을 롤업 유혹 : 여기

뿌린와 변화의/시간에 대한 심 당신은 다양한 태그 또는 카테고리 또는 genuses 또는 무엇이든에서 값을 수집하고 싶습니다 영감을주는 하나의 라이너이지만 유지 보수성을 위해 나는 각 단계를 명시 적으로 풀어 놓은 상태로 보관하고 싶습니다.

물론 yourCodeHere [value]는 여러 줄의 주석이 달린 코드 일 수 있습니다.

참고 : 나는

+1

"모든 것을 경외심을 불러 일으키는 단 하나의 라이너로 만들려고 유혹합니다."항상 그렇지는 않습니다 ... – acl