2017-03-15 1 views
0

고정 폭 파일 형식 (원래는 Fortran 루틴에 대해 입력 됨)이 있습니다. 파일의 여러 라인은 다음과 같이 :Octave/Matlab - 고정 폭 파일 읽기

1078.0711005.481 932.978 861.159 788.103 716.076 

이 실제로 읽어야 방법 :

1078.071 1005.481 932.978 861.159 788.103 716.076 

내가 시도하는 다양한 방법, textscan, fgetl을, fscanf는, 그러나 내가 가지고있는 문제 등, 위에서 보았 듯이 원래 파일의 고정 너비 때문에 일부 숫자 사이에 공백이 없습니다. 나는 그 (것)들을 직접적으로 읽는 방법을 찾아내는 것을 보이지 않으며 나는 본래 체재를 바꿀 수 없다.

는 는

내가 지금까지 가지고 올의 전체 라인을 읽고 fgetl를 사용하는 한 가장, 그때 나는 다음과 같은 결과를 생성하는 8,6 배열

A=fgetl 
A=reshape(A,8,6) 

에 결과를 바꿀

그 어려움뿐만하려고 한 strcat와 외관상 있지만
11 
009877 
703681 
852186 
...... 
049110 
787507 
118936 

은 이제 I은 상기 및 I는 각 번호를 형성하도록 함께 해당 배열의 열을 연결할 수있을 생각, vertcat 등

그 모든 것이 너무 길어서 더 좋은 제안을 기대하고있었습니다.

감사합니다.

+0

열 간격이 같으면 서로 뭉개져 있어도 나머지는 str2double (A (1 : 8)) 및 str2double (A (9:16)) 등을 수행 할 수 있습니다. 줄의. 열의 길이가 변경되지 않는 한이 방법이 도움이 될 수 있습니다. 나는 완전한 대답을 만들기 위해 순간에 MATLAB 접근이나 시간을 가지고 있지 않다. – fyrepenguin

답변

1

누락 된 공백을 생성하는 간단한 정규 표현식을 사용할 수 있습니다

s = '1078.0711005.481 932.978 861.159 788.103 716.076'; 
s = regexprep(s, '(\.\d\d\d)', '$1 '); 
c = textscan(s, '%f'); 

지금 c{1}이 번호가 포함되어 있습니다. 실제로 s이 한 줄 대신 전체 파일 인 경우에도 작동합니다.

+0

고맙다. 위의 두 가지 답변이 도움이되었는데, 나는 이것을 매우 비슷한 것으로 받아 들일 것이다. 나는 정규 표현식을 사용하지 않을 것이라고 생각했다. . – user2551578

0

당신은 어떤 출력 클래스를 언급하지 않았지만 계산을하기 위해 파일에서 복식을 읽을 필요가 있다고 생각합니다. reshape()의 결과가 이미 있기 때문에 파일을 읽을 수 있다고 가정합니다. 그러나 변수가 고정 크기가 아니기 때문에 (예 : 1078.071 및 932.978) reshape() 함수를 사용하면 효율적이지 않습니다.

나는 당신의 문제를 오해 did't 경우

  1. 귀하의 데이터는 일부 지역에서 숙청된다 (즉 1078.0711005.481 대신 1005.481 1078.071의).

  2. 변수의 소수 부분에는 3 자리 숫자가 있습니다.

우리는 문자열 배열에서 공백을 제거하는 데 필요한 모든의

첫째 :

iter = length(strfind(A, '.')); 
for k=1:iter 
    [stat,ind] = ismember('.', A); 
    B(k)=str2double(A(1:ind+3)); 
    A = A(ind+4:end); 
end 

B하는 것 : 소수 부분은 3 개 자리는 그런 정보를 사용하여

A = A(~ismember(A,' ')); 

있음 결과로서 복소수의 배열. 세 소수에 의존하는 경우