2016-06-21 2 views
3

텍스트 파일에 작성된 텐서 요소를 읽으려고합니다. 파일의 첫 번째 행은 텐서 차원을 정의합니다. 다음 줄은 텐서 값을 나타냅니다. Matlab 구문에서 다음 코드 줄을 사용하여이 작업을 수행 할 수 있었지만 Julia에서 동일한 기능을 코딩하는 데 어려움을 겪고 있습니다. 어떤 도움이라도 대단히 감사합니다. @colin 그의 의견에 같은 파일이 쉽게와 줄리아로 읽을 수 있습니다 말했듯이Julia와 데이터가 포함 된 텍스트 파일을 한 줄씩 파싱 하시겠습니까?

  4   4   48 
1.00000 0.00000 0.00000 0.00000 
0.00000 1.00000 0.00000 0.00000 
0.00000 0.00000 1.00000 0.00000 
0.00000 0.00000 0.00000 1.00000 
-1.00000 0.00000 0.00000 0.00000 
0.00000 1.00000 0.00000 0.00000 
0.00000 0.00000 -1.00000 0.00000 
0.00000 0.00000 0.00000 1.00000 
-1.00000 0.00000 0.00000 0.00000 
... 
+0

Matlab 구문에 익숙하지 않은 사용자는 코드에서 읽을 수있는 데이터 파일의 간단한 예를 들려 줄 수 있습니다. – Simon

+0

좋은 아이디어! 감사! – lenzinho

+2

라인별로 파싱을해야하는 이유를 잘 모르겠습니다. 제공된 예제에서 한 줄에 동일한 수의 열이 있고 모든 데이터가 숫자이므로 'readdlm'만 할 수없는 이유는 무엇입니까? –

답변

3

, 당신은 다음과 같은 사용할 수 있습니다 특히

a = open("/path/to/data.txt", "r") 
for line in eachline(a) 
    print(line) ## or whatever else you want to do with the line. 
end 
close(a) 

를, 같은 구문 :

LineArray = split(replace(line, "\n", ""), "\t") 

당신에게 유용 할 수 있습니다. (a) 줄 끝에서 줄 바꿈을 제거한 다음 (b) 줄에서 인덱싱 된 배열로 분할하여 줄에서 차지하는 예측 가능한 위치에 따라 요소를 꺼낼 수 있습니다.

또한 둘 수 있었다 :

Header = readline(a); 

을 특별히 헤더를 꺼내 한 다음 위의 루프를 실행하려는 경우 파일을 열 직후. 또는 eachline(a)보다 enumerate()을 사용하고 열거 형의 색인에서 논리를 수행 할 수 있습니다 (예 : 색인 = 1 일 때 헤더를 정의).

이것은 데이 캐스터의 응답보다 느려지므로, 실제로 추가 유연성이 필요할 경우에만 가치가 있습니다.

5

:

fid=fopen(fname); 
    shape = sscanf(fgetl(fid),'%i'); 
    for j = 1:shape(3) 
    for i = 1:shape(1) 
     A(i,:,j) = str2num(fgets(fid)); 
    end 
    end 
fclose(fid); 

일반적인 파일의 첫 번째 줄

는 아래 재현

julia> data, heading = readdlm("/tmp/data.txt", header=true) 
(
9x4 Array{Float64,2}: 
    1.0 0.0 0.0 0.0 
    0.0 1.0 0.0 0.0 
    0.0 0.0 1.0 0.0 
    0.0 0.0 0.0 1.0 
-1.0 0.0 0.0 0.0 
    0.0 1.0 0.0 0.0 
    0.0 0.0 -1.0 0.0 
    0.0 0.0 0.0 1.0 
-1.0 0.0 0.0 0.0, 

1x4 Array{AbstractString,2}: 
"4" "4" "48" "") 

반환되는 두 값은 Float64 배열이고 머리글 행은 문자열 배열입니다.

어떤 용도로 사용 하시겠습니까? 당신은 라인별로 읽고 싶지 않을 경우

관련 문제