簡體   English   中英

如何編寫與在MATLAB中讀取的格式相同的文本文件?

[英]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列中。 如果您需要對日期和時間值做任何事情,可以查看以下函數以弄清楚如何將它們轉換為不同的格式: DATENUMDATESTRDATEVEC

修改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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM