2014-02-05 5 views
0

본질적으로 Matlab 파일을 작성하여 텍스트 파일에서 "STR"및 "CON"아래 줄의 두 번째, 세 번째 및 네 번째 숫자를 변경합니다 (아래 및 '0.dat'라고 함). 현재, Matlab 코드는 텍스트 파일을 변경하지 않습니다.Matlab을 사용하여 텍스트 파일 수정하기

pri 
3 
len 0.03 
vic 5 5 
MAT 
1 147E9 0.3 0 4.9E9 8.5E9 
LAY 
1 0.000125 1 45 
2 0.000125 1 0 
3 0.000125 1 -45 
4 0.000125 1 90 
5 0.000125 1 45 
WAL 
1 1 2 3 4 5 
PLATE 
1 0.005 1 1 
STR 
1 32217.442335442 3010.34241024889 2689.48842888812 
CON 
1 2 1 2 3 1 3 4 1 4 5 1 5 6 1 6 7 1 
ATT 
1 901 7 901 
LON 
34 
POI 
123456 
1 7 
X 0.015 
123456 
2 6 
X 0.00381966011250105 0.026180339887499 
123456 
3 5 
X 0.000857864376269049 0.0291421356237309 
123456 
4 
X 0 
PLO 
2 3 
CRO 
0 
RES 
INMOD=1 
END 

MATLAB 코드 텍스트 파일 : importdata에 대한 도움말에서

impafp = importdata('0.dat','\t'); 
afp = impafp.textdata; 

fileID = fopen('0.dat','r+'); 
    for i = 1:length(afp) 
     if (strncmpi(afp{i},'con',3)) 
      newNx = 100; 
      newNxy = 50; 
      newNy = 500; 
      myformat = '%0.6f %0.9f %0.9f %0.9f\n'; 
      newData = [1 newNx newNxy newNy]; 
      afp{i-1} = fprintf(fileID, myformat, newData); 
      fclose(fileID); 
     end 
    end 
+0

fprintf 또는 equal이 포함되어 있지 않으므로 코드가 파일에 데이터를 쓰지 않습니다. – Daniel

+0

답변 해 주셔서 감사합니다. 나는 내가 너무 잘 모르겠다. 필자는 마지막 줄의 fprintf를 사용하여 이전에 i-1 줄에 쓰여진 텍스트를 덮어 쓸 것이라고 생각했습니다. – Jojo

+0

맞습니다. 나는 코드를 잘못 읽었습니다. 텍스트 내용을 포함하는 셀에 기록 된 바이트 수를 할당하면 어떻게 든 나를 혼란스럽게 만들었습니다. – Daniel

답변

1

:

ASCII 파일 및 스프레드 시트를 들어

, IMPORTDATA 숫자 찾을 것으로 예상 직사각형 형태의 데이터 (즉, 행렬과 같은). 텍스트 헤더는 숫자 데이터의 위 또는 왼쪽에 으로 표시 될 수 있습니다. ASCII 파일을문자의 열이나 형식이 지정된 날짜 또는 시간을 비롯한 다른 모든 숫자로 가져 오려면 가져 오기 데이터 대신 TEXTSCAN을 사용하십시오.

실제로 afp의 값을 인쇄하면 첫 번째 행만 표시됩니다. 또한 파일에 쓰는 작업을 수행하지 않았습니다. 그리고 if 상태가 트리거되지 않은 경우 파일 ID를 닫지 않았습니다. 당신은 논리적 색인에 익숙하지 않은 경우

% Read in data as strings using textscan 
fid = fopen('0.dat','r'); 
afp = textscan(fid,'%s','Delimiter',''); 
fclose(fid); 

isSTR = strncmpi(afp{:},'str',3); % True for all lines starting with STR 
isCON = strncmpi(afp{:},'con',3); % True for all lines starting with CON 

% Find indices to replace - create logical indices 
% True if line before is STR and line after is CON 
% Offset isSTR and isCON by 2 elements in opposite directions to align 
% Use & to perform vectorized AND 
% Pad with FALSE on either side to make output the same length as afp{1}{:} 
datIDX = [false;(isSTR(1:end-2)&isCON(3:end));false]; 

% Overwrite data using sprintf 
myformat = '%0.6f %0.9f %0.9f %0.9f'; 
newNx = 100; 
newNxy = 50; 
newNy = 500; 
newData = [1 newNx newNxy newNy]; 
afp{1}{datIDX} = sprintf(myformat, newData); % Set only elements that pass test 

% Overwrite old file using fprintf (or change filename to new one) 
fid = fopen('0.dat','w'); 
fprintf(fid,'%s\r\n',afp{1}{1:end-1}); 
fprintf(fid,'%s',afp{1}{end}); % Avoid blank line at end 
fclose(fid); 

, 당신은 this blog postthis를 읽을 수 있습니다

여기에 (너무 아마도 빠른) textscan이 작업을 수행 할 수있는 한 가지 방법입니다.

+0

감사합니다. 코드 작업은 필수이지만 텍스트 파일의 출력에는 줄 바꿈이 포함되어 있지 않습니다. 이것이 어떻게 수정 될 수 있는지 알고 있습니까? 고마워요 – Jojo

+0

@ 조조 : 어떤 텍스트 파일을 출력하셨습니까? 'afp {1}'의 데이터에''\ n ''줄 바꿈이 없다고 말하는 겁니까? 그것은'textscan'이 그것들을 제거하기로되어 있지 않습니다. 당신이 그들을 원하니? – horchler

+0

아니면 편집 된 파일이 어떻게 든 엉망이되어 하나의 줄에 있다는 말입니까? 그런 일이 발생하면 '텍스트 스캔'이 데이터를 읽는 방식을 변경해야 할 수도 있습니다. 필자는 데모 데이터를 파일에 복사/붙여 넣기하여이를 테스트했으며 정상적으로 작동했습니다. 여기에 질문을 올렸을 때 변환 된 공백이 아닌 탭이있을 수 있습니다. 또한 줄 끝 문제 일 수도 있습니다 (Windows에 있습니까?). 이 줄을'fprintf (fid, '% s \ r \ n', afp {1} {1 : end-1});'(''\ r '')로 변경해보십시오. – horchler

1

"키워드"가 포함 된 줄을 찾고 특정 줄을 수정 한 다음 동일한 이름이나 다른 줄을 가질 수있는 파일에 다시 쓰는 것이 전체 파일을 읽는 것이 좋습니다.

file = fileread('file.dat'); 
parts = regexp(file,'\n','split'); 
startIndex = find(~cellfun('isempty',regexp(parts,'STR'))); 
endIndex = find(~cellfun('isempty',regexp(parts,'CON'))); 
ind2Change = startIndex+1:endIndex-1; 
tempCell{1} = sprintf('%0.6f %0.9f %0.9f %0.9f',[1,100,50,500]); 
parts(ind2Change) = deal(tempCell); 


out = sprintf('%s\n',parts{:}); 
out = out(1:end-1); 
fh = fopen('file2.dat','w'); 
fwrite(fh,out); 
fclose(fh); 
+0

루프가 필요 없습니다. 셀 배열을 파일에 쓰려면'fprintf'를 사용하십시오. – horchler

+0

@horchler 좋은 전화. 이것은 훨씬 더 좋네요 :) – MZimmerman6

+0

나는이 경우에 정규 표현식을 사용하는 것이 ['strfind'] (http://www.mathworks.com/help/matlab/ref/strfind.html)가 더 효율적인 선택 일 것이라고 생각합니다. 그것은 세포에서도 효과가 있습니다. 그건 그렇고, 필자는 이전에 ['fileread'] (http://www.mathworks.com/help/matlab/ref/fileread.html)에 대해 알지 못했습니다 (['' fread'] (http://www.mathworks.com/help/matlab/ref/fread.html)) 감사합니다. – horchler