简体   繁体   English

如何编写与在MATLAB中读取的格式相同的文本文件?

[英]How do I write a text file in the same format that it is read in MATLAB?

I have asked a related question in the past and I know how to read the file thanks to the help of the experts here. 过去我曾问过一个相关的问题 ,在这里专家的帮助下,我知道如何读取文件。 Now I have a new problem. 现在我有一个新问题。 I first read the data from the file like so: 我首先像这样从文件中读取数据:

fid = fopen('D:\file.txt', 'rt');
a = textscan(fid, '%s %f %f %f %f %f %f', ...
             'Delimiter',',', 'CollectOutput',1, 'HeaderLines',1);
fclose(fid);

I then process the file and change a few values of the column. 然后,我处理文件并更改列的一些值。 Now I want to write a new file newfile.txt in the exact same format as my file.txt with the new values. 现在,我想以与我的file.txt完全相同的格式编写一个新文件newfile.txt ,并带有新值。 How do I do that? 我怎么做?

If I do the following: 如果我执行以下操作:

M = [datenum(a{1}) a{2}];
dlmwrite('newfile1.txt', M);

it gives me a new file without my first row of headers and without column 1 and column2 in the format I want. 它给我一个新文件,没有我的第一行标题,也没有我想要的格式的第1列和第2列。

My file format is given below: 我的文件格式如下:

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

i am able to make a new file.txt in format 我能够以格式创建新的file.txt

My file format is given below: 我的文件格式如下:

                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

Can some one help me 2 copy the headers and the first 2 columns into this new file? 有人可以帮我2将标题和前两列复制到此新文件中吗?

Note: I've updated the answer to work with the most current file format specified in the question (ie a comma between the date and time values). 注意:我已经更新了答案,以使用问题中指定的最新文件格式(即日期和时间值之间的逗号)。 I've also written the code below to handle very large files where the number of columns are known but the number of rows is variable. 我还编写了以下代码来处理非常大的文件,在这些文件中,列数是已知的,但行数是可变的。

First, you'll have to read your file using the following updated code (which saves the top line using the function FGETS ): 首先,您必须使用以下更新的代码读取文件(使用代码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

Next, you have to reshape data using the known number of columns of data ( not counting the date and time columns): 接下来,您必须使用已知的数据列数来重塑data计算日期和时间列):

N = 74;  %# Number of columns of data after the date and time
data = reshape(data{1},N+6,[])';

Now data is a matrix where the first six columns contain date and time information (month, day, year, hours, minutes, and seconds) and all the other data is in the remaining N columns. 现在, data是一个矩阵,其中前六列包含日期和时间信息(月,日,年,小时,分钟和秒),而所有其他数据在其余N列中。 If you need to do anything with the date and time values, you can look at the following functions to figure out how to convert them to different formats: DATENUM , DATESTR , and DATEVEC . 如果您需要对日期和时间值做任何事情,可以查看以下函数以弄清楚如何将它们转换为不同的格式: DATENUMDATESTRDATEVEC

After you've modified the values in data you can resave it using a for loop and the FPRINTF function: 修改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

I ran the above code with an 86400-by-80 matrix for data and it took around 30 seconds to write the data to a file. 我使用86400 x 80矩阵运行上述代码来data ,将数据写入文件大约需要30秒。

dlmwrite writes a variable (for example, your array of M) to a file in ASCII text, as you know. 众所周知,dlmwrite将变量(例如,M的数组)以ASCII文本写入文件中。 Check the documentation for the function to discover how to set the separator character (to get , between values in each row) and how to append to an existing file. 检查该函数的文档,以发现如何设置分隔符(在每一行中的值之间获取get)以及如何追加到现有文件。

To write the header line, I suggest you set up an array of strings, populate it and use dlmwrite to write it to your output file. 要写标题行,建议您设置一个字符串数组,填充它,然后使用dlmwrite将其写入输出文件。

Now, if you want to write the rest of the file (the M array plus 2 leading columns of dates/times) you will need to create a temporary array with size the same as M plus 2 extra columns. 现在,如果要写入文件的其余部分(M数组加上2个日期/时间的前导列),则需要创建一个大小与M加上2个额外列相同的临时数组。 Since your data values are floating-point numbers and your dates and times are structured data of some sort (strings perhaps) I think Mtemp will have to be an array of strings. 由于您的数据值是浮点数,而您的日期和时间是某种结构化的数据(也许是字符串),所以我认为Mtemp必须是字符串数组。 Once you have created it you can append it to your output file with a single dlmwrite statement. 创建它之后,您可以使用单个dlmwrite语句将其附加到您的输出文件中。

Note that num2str operates as you might hope on vectors but I'm not sure it can be coerced into putting , between values. 请注意,num2str可以像您期望的那样在向量上运行,但是我不确定它是否可以强制放入值之间。 It can, however, write numbers in a format you specify. 但是,它可以按照您指定的格式写数字。

If this doesn't give you the output you want, or your array is too big to copy and expand or you have some other reason for not liking the proposed solution, then I fear that you will have to write a loop to write the output a line at a time, and use low-level file writing functions. 如果这没有给您想要的输出,或者数组太大而无法复制和扩展,或者您有其他原因不喜欢建议的解决方案,那么我担心您将不得不编写一个循环来编写输出一次一行,并使用低级文件写入功能。

Regards 问候

Mark 标记

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM