2014-02-05 65 views
0

基本上我正在寫一個Matlab文件更改文本文件中的第二個,在下面的「STR」線和上面的「CON」第3和第4號(這在下文中給出被稱爲'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代碼

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

從幫助importdata

對於ASCII文件,電子表格,IMPORTDATA希望找到數字 矩形形式的數據(即,像矩陣)。文本標題可以在數字數據的上方或左側出現 。要導入的ASCII文件 與數字字符其他地方,包括 數據或格式化日期或時間字符列,使用TEXTSCAN代替進口數據。

事實上,如果您打印出afp的值,則會看到它只包含第一行。您還沒有執行任何寫入文件的操作。如果沒有觸發if狀態,則您沒有關閉文件ID。

這裏是textscan做到這一點的一種方式(這可能是太快):

% 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

+0

感謝horchler。代碼工作是必需的,但文本文件中的輸出不包含任何換行符。你知道這可以如何糾正?謝謝 – Jojo

+0

@Jojo:你指的是哪個文本文件的輸出?你是說'afp {1}'中的數據沒有'\ n''換行符嗎?它不應該像'textscan'那樣去掉。你想要他們嗎? – horchler

+0

或者你是否在說編輯過的文件已被破壞,以至於它全部在同一行?如果發生這種情況,那麼可能需要更改'textscan'讀取數據的方式。我通過將你的演示數據複製/粘貼到一個文件中來測試它,並且它工作正常(當你在這裏發佈你的問題時,你可能有選項卡而不是轉換的空格)。這也可能是一個結束的問題(你在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