[英]How do I write a text file in the same format that it is read in MATLAB?
過去我曾問過一個相關的問題 ,在這里專家的幫助下,我知道如何讀取文件。 現在我有一個新問題。 我首先像這樣從文件中讀取數據:
fid = fopen('D:\file.txt', 'rt');
a = textscan(fid, '%s %f %f %f %f %f %f', ...
'Delimiter',',', 'CollectOutput',1, 'HeaderLines',1);
fclose(fid);
然后,我處理文件並更改列的一些值。 現在,我想以與我的file.txt
完全相同的格式編寫一個新文件newfile.txt
,並帶有新值。 我怎么做?
如果我執行以下操作:
M = [datenum(a{1}) a{2}];
dlmwrite('newfile1.txt', M);
它給我一個新文件,沒有我的第一行標題,也沒有我想要的格式的第1列和第2列。
我的文件格式如下:
date time, M01, M02, M03, M04, M05, M06
8/15/2009, 0:00:00, 5.8, 7.8, 7.8, 7.3, 0, 7.9
8/15/2009, 0:10:00, 7.1, 8.1, 8.1, 7.7, 0, 8.1
8/15/2009, 0:20:00, 6.8, 7.4, 7.6, 7.1, 0, 7.3
8/15/2009, 0:30:00, 5.6, 6.8, 7.1, 6.6, 0, 6.8
8/15/2009, 0:40:00, 3.9, 6.2, 6.4, 6.2, 0, 6.4
8/15/2009, 0:50:00, 4.6, 5.5, 6.1, 5.8, 0, 5.6
8/15/2009, 1:40:00, 7, 7, 7.2, 6.9, 0, 6.3
我能夠以格式創建新的file.txt
我的文件格式如下:
5.8, 7.8, 7.8, 7.3, 0, 7.9
7.1, 8.1, 8.1, 7.7, 0, 8.1
6.8, 7.4, 7.6, 7.1, 0, 7.3
5.6, 6.8, 7.1, 6.6, 0, 6.8
3.9, 6.2, 6.4, 6.2, 0, 6.4
4.6, 5.5, 6.1, 5.8, 0, 5.6
7, 7, 7.2, 6.9, 0, 6.3
有人可以幫我2將標題和前兩列復制到此新文件中嗎?
注意:我已經更新了答案,以使用問題中指定的最新文件格式(即日期和時間值之間的逗號)。 我還編寫了以下代碼來處理非常大的文件,在這些文件中,列數是已知的,但行數是可變的。
首先,您必須使用以下更新的代碼讀取文件(使用代碼FGETS保存第一行):
fid = fopen('D:\file.txt','rt'); %# Open the file
topLine = fgets(fid); %# Read the top line and store it in a string
data = textscan(fid,'%f','Delimiter',',/:'); %# Read the data
fclose(fid); %# Close the file
接下來,您必須使用已知的數據列數來重塑data
( 不計算日期和時間列):
N = 74; %# Number of columns of data after the date and time
data = reshape(data{1},N+6,[])';
現在, data
是一個矩陣,其中前六列包含日期和時間信息(月,日,年,小時,分鍾和秒),而所有其他數據在其余N
列中。 如果您需要對日期和時間值做任何事情,可以查看以下函數以弄清楚如何將它們轉換為不同的格式: DATENUM , DATESTR和DATEVEC 。
修改data
的值之后,可以使用for循環和FPRINTF函數重新保存它:
fid = fopen('newfile1.txt','wt'); %# Open the file
fprintf(fid,'%s',topLine); %# Print the top line
for i = 1:size(data,1) %# Loop over the rows of data
fprintf(fid,'%d/%d/%d, %d:%d:%d',data(i,1:6)); %# Print the date
fprintf(fid,', %.1f',data(i,7:end)); %# Print the data
fprintf(fid,'\n'); %# Print a newline
end
fclose(fid); %# Close the file
我使用86400 x 80矩陣運行上述代碼來data
,將數據寫入文件大約需要30秒。
眾所周知,dlmwrite將變量(例如,M的數組)以ASCII文本寫入文件中。 檢查該函數的文檔,以發現如何設置分隔符(在每一行中的值之間獲取get)以及如何追加到現有文件。
要寫標題行,建議您設置一個字符串數組,填充它,然后使用dlmwrite將其寫入輸出文件。
現在,如果要寫入文件的其余部分(M數組加上2個日期/時間的前導列),則需要創建一個大小與M加上2個額外列相同的臨時數組。 由於您的數據值是浮點數,而您的日期和時間是某種結構化的數據(也許是字符串),所以我認為Mtemp必須是字符串數組。 創建它之后,您可以使用單個dlmwrite語句將其附加到您的輸出文件中。
請注意,num2str可以像您期望的那樣在向量上運行,但是我不確定它是否可以強制放入值之間。 但是,它可以按照您指定的格式寫數字。
如果這沒有給您想要的輸出,或者數組太大而無法復制和擴展,或者您有其他原因不喜歡建議的解決方案,那么我擔心您將不得不編寫一個循環來編寫輸出一次一行,並使用低級文件寫入功能。
問候
標記
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.