我有一个像这样的输入.txt文件
head1 head2 head3 head3
0.004 5.104175 -1.651492 0.074480
0.015 5.104175 -1.327670 0.087433
0.025 5.104175 -1.181950 0.093910
...
我希望将第一行减去同一文件中的所有后续行,即打印.txt文件,如下所示:
0 0 0 0
0.011 0 -0.323825 -0.012953
...
这是我的代码:
for i = 1:length(x) %read all the files contained in folder_inp
%%check file extensions
[pathstr,name,ext] = fileparts(x(i).name);
%%if it is a text file...
if strcmp('.txt',ext)
s = importdata(strcat(folder_inp,'\',x(i).name));
init = s.data(1,:);
for k=1:length(s.data)
if s.data(k,:) == init
s.data(k,:) = zeros(1,length(s.data(k,:)));
else
s.data(k,:) = s.data(k,:)-init;
end
end
fid = fopen( strcat(folder_out,'\',name,'.txt'), 'w' );
formatSpecs = '%20s %20s %20s %20s \r';
for j = 1:length(s.data)
if j == 1
fprintf(fid,formatSpecs,'head1','head2','head3','head4');
elseif j==2
fprintf(fid,'\n') ;
else
fprintf(fid,formatSpecs,s.data(j,1),s.data(j,2),s.data(j,3),s.data(j,4));
end
end
fclose(fid);
end
end
everithing工作得很好,解释了这样一个事实:代码打印出一个空字符而不是0。有什么建议吗?
答案 0 :(得分:1)
您的问题是,您在format specifiers的通话中使用了错误的fprintf
。您正在使用转换字符%s
,它将您的输入参数解释为字符串。由于您的数据实际上是数字,MATLAB会尝试首先将它们转换为字符串。对于浮点值,这似乎工作正常,但整数值被解释为ASCII码并转换为其等效的ASCII字符。请注意此示例,使用%s
:
>> sprintf('%s ', [pi 0 65 66 67 pi])
ans =
3.141593e+00 ABC 3.141593e+00
pi
的值将转换为适当的字符串,但0 65 66 67
会转换为NULL字符加ABC
。
您应该使用格式说明符来表示数值,例如%f
:
>> sprintf('%f ', [pi 0 65 66 67 pi])
ans =
3.141593 0.000000 65.000000 66.000000 67.000000 3.141593
答案 1 :(得分:1)
除了使用可解决问题的%f
之外,您还可以执行以下操作来清理代码并使其适用于任意数量的列和任何标题文本。
% getting the headers
oldFile = fopen('text_in.txt');
headers = fgets(oldFile);
fclose(oldFile);
% reading and manipulating the data
data = dlmread('test.txt', '\t', 1, 0); % skip the first row of headers
data = repmat(data(1,:), size(data, 1), 1) - data; % subtract first row
% the format spec
formatspec = [repmat('%f ',1 , size(data, 2)) '\r\n'];
% writing to the new file
fid = fopen('text_out.txt', 'w');
fprintf(fid,'%s',headers); % the header
fprintf(fid, formatspec, data'); % the data
fclose(fid);