Using strepp on a textfile with replacement from array.
1 次查看(过去 30 天)
显示 更早的评论
EDIT due to comments (learning to ask better questions)
Inputs
1)I have an EXCEL array of dimensions 322x8 containing numeric data of a specific format (3.548E-07). e.g.
if true
H+ Ca Mg HCO3 Na K SO4 Cl
3.548E-07 1.183E-01 3.222E-02 1.560E-02 5.771E-01 0.000E+00 2.666E-02 8.113E-01
continued for 321 more rows
end
2)I have a text template file and contained within are 8 strings (%1 to %8) e.g.
if true
'GASES'
'*'
'SURFACE COMPLEXES'
'*' 'no mineral' 'xoh'
'SPECIES W/ Kd and DECAY decay constant(1/s)'
'*' 0.0 0.0 0.0
'EXCHANGEABLE CATIONS' 0
' master convention ex. coef.'
'*' 0 0 0.000e+000
'------------------------------------------------------------------------------'
'INITIAL AND BOUNDARY WATER TYPES'
1 1 !niwtype, nbwtype = number of initial and boundary waters
1 30.0 !iwtype initial, temp (C)
' icon guess ctot constrain' ! Modern seawater
'h2o' 1 1.000d+0 1.000d+0 ' ' 0 !
'h+' 3 %1 %1 ' ' 0 !pH=8.22
'ca+2' 1 %2 %2 ' ' 0
'mg+2' 1 %3 %3 ' ' 0
'hco3-' 1 %4 %4 ' ' 0
'na+' 1 %5 %5 ' ' 0
'k+' 1 %6 %6 ' ' 0
'so4-2' 1 %7 %7 ' ' 0
'cl-' 1 %8 %8 ' ' 0
'*' 0 0.0 0.0 ' ' 0
1 30.0 !iwtype boundary, temp (C)
end
Process and Output
1) I need to replace the 8 strings from the template file with the row data. I need to repeat this 322 times and save each newly created text file with exactly the same name to a directory.
Thoughts So far I have tried to use the' strrep' function failing miserably.
Please Help!!!!
3 个评论
采纳的回答
Thorsten
2015-2-17
A sketch how you could proceed:
1. Read the EXCEL file with xlsread
2. Create long array of char with the desired information
text = 'if true ''GASES'' ... % up the h2o line
Append the rows with the missing data
text = [text
sprintf(' ''h+'' 3 %.3E %.3E '' '' 0 !pH=8.22', 3.548E-07, 3.548E-07)]
3. write the stuff to a file using
save(filename, text, '-ascii')
Please let me know if you got stuck somewhere when implementing along these hints.
6 个评论
Thorsten
2015-2-17
You have to select the column of data that you need in the filledtemplateline:
template = fileread('template.txt');
formatstr = '%1.3E';
% this is just to replace the %1, %2 ...%8 in the template
% with '%1.3E'; it could be done by editing he template you store,
% but I thought it would be nicer to do it in Matlab
for i=1:8
template = strrep(template, sprintf('%%%d', i), formatstr);
end
data = xlsread('data.xlsx');
% this is the main loop that runs trough your data and creates the files
% I dont't know the format of data, so you have to adjust the next two lines accordingly; data_i has to be the 8 values you need to fill the template.
for i = 1:Columns_of_your_data
data_i = data(:,i);
flattenx = @(x) x(:);
filledtemplate = sprintf(template, ...
repmat(flattenx(repmat(data_i, [2 1])), [2 1]));
filename = sprintf('Sol%d.txt', i);
fid = fopen(filename, 'w');
fprintf(fid, '%s', filledtemplate);
fclose(fid);
end
Hope that's now clearer and you can solve your problem.
更多回答(1 个)
Stephen23
2015-2-17
编辑:Stephen23
2015-2-17
Here is a pseudocode outline of how you could do this:
data = readExcel;
temp = fileread(filename);
%
xpr = cellstr(reshape(sprintf('(?<=\\s)%%%d(?=\\s)',1:8),[],8).');
%
for k = 1:rows(data)
% extract the data for one instance:
vec = data(k,:);
% convert vec to cell of strings, if required.
% vec should have one string value per cell, size 1x8.
% replace the values in the template:
str = regexprep(temp, xpr, vec);
%
fid = fopen(filename);
fprintf(fid,str);
fclose(fid);
end
You can use regexprep to replace all of those strings simultaneously, without any loops. Because '%1' occurs in other places in the template, I only replace instances of ' %N ', ie with a space character on both sides. You can use fileread to get the whole template as one string.
2 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Data Type Conversion 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!