Problem appending a variable to an existing text file using save
조회 수: 6 (최근 30일)
이전 댓글 표시
I have some measurements in a cell array.
data ={...
'AS-01_09' [ 52] [451] [4724] [1]
'AS-01_08' [38.3000] [451] [4724] [1]
'AS-01_07' [ 37] [451] [4724] [1]
'AS-01_06' [23.1000] [451] [4724] [1]
'AS-01_05' [25.6000] [451] [4724] [1]
'AS-01_04' [ 89] [451] [4724] [1]
'AS-01_03' [75.8000] [451] [4724] [1]
'AS-01_02' [49.6000] [451] [4724] [1]
'AS-01_01' [26.3000] [451] [4724] [1]
'AS-02_5' [38.2000] [489] [4736] [2]
'AS-02_4' [ 45] [489] [4736] [2]
'AS-02_3' [44.7000] [489] [4736] [2]
'AS-02_2' [44.2000] [489] [4736] [2]
'AS-02_1' [47.3000] [489] [4736] [2]};
Column 1 has station codes (names), column 2 measurement values, column 3 local X coordinates, column 4 local Y coordinates, column 5 location flag (there are multiple stations for each location).
I also have in a separate cell location names. Stations from the same location have the same location name.
loctns={...
'AS-01'
'AS-01'
'AS-01'
'AS-01'
'AS-01'
'AS-01'
'AS-01'
'AS-01'
'AS-01'
'AS-02'
'AS-02'
'AS-02'
'AS-02'
'AS-02'};
I am trying to separate the measurements by location and save each location to a separate file. I also want to smooth the measurements and do the same for the smoothed measurements.
This is my code:
%%Get measurements' matrix
measurements=cell2mat(data(:,2:5));
%%Split 'measurements' matrix based on flag in first column
A = arrayfun(@(x) measurements(measurements(:,4) == x, :),...
unique(measurements(:,4)),'uniformoutput', false);
%%Get the list of unique location names
loctn_names=unique(loctns);
%%Smooth measurements
% Save smoothed and original values to a separate file for each location
[rw,cw]=size(loctn_names);
count=0;
for i = 1:rw
values = A{i,:}(:,1); % access arrays in 'A' with content indexing (curly
% brackets) then access first column (values) with
% regular indexing (parentheses)
j=length(values); % access variable 'data' to create
stations=data(count+1:count+j,1); % a 1D array of station names
count=count+j; % to append to the output file
IN = A{i,1}(:,1:3); % creating matrix of data for each loctn
tempname=strcat(char(loctn_names(i)),'_X-Y-V.txt'); % temporary file name
save(tempname, 'IN', '-ASCII'); % save matrix of data to output file
%save(tempname, 'stations', '-append'); % append station names to file
valuesSM=conv(values,[0.5 1 0.5],'same')/2; % smoothing by convolution
valuesSM(1)=values(1);
valuesSM(end)=values(end); % ensuring extremes are same
% as in original values
OUT = IN; OUT(:,1)=valuesSM(:); % creating matrix of data for each loctn
tempname1=strcat(char(loctn_names(i)),'_X-Y-smooth_V.txt') % file name
save(tempname1, 'OUT', '-ASCII'); % save matrix of data to output file
%save(tempname1, 'stations', '-append'); % append stations names to file
end
It is all working as expected, except for the two lines to append the station names, which are commented out. If I uncomment them, I get this error message:
Error using save
Unable to write to MAT-file \\...\Measurements\AS-01_X-Y-V.txt
File may be corrupt.
Does the append option as described in here only apply to .mat files? If yes, in what other way can I append the variable to the output file?
Thank you.
댓글 수: 0
채택된 답변
James Tursa
2015년 3월 26일
You still need to tell MATLAB that it is an ASCII text file you are writing to and not a mat file. E.g.,
save(tempname1, 'stations', '-append', '-ascii')
댓글 수: 2
James Tursa
2015년 3월 26일
편집: James Tursa
2015년 3월 26일
Yes, it appears save will convert your string to numeric and then write that out. You may have to resort to fwrite for this. E.g.,
fid = fopen(tempname1,'at'); open in append ASCII text mode
fwrite(fid,stations,'*uchar'); % append the string as character data
fprintf(fid,'\n'); % append a newline
fclose(fid); % close the file
Or you may need to wrap a loop around the fwrite and fprintf if stations is a cell array of strings and you want to print one string per line, etc.
추가 답변 (0개)
참고 항목
카테고리
Help Center 및 File Exchange에서 Characters and Strings에 대해 자세히 알아보기
제품
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!