% 10.34 - Fall 2006 HW#1 % Problem #3 % Text reading and writing % Rob Ashcraft - Sept. 7th, 2006 % This script reads in two specific files (a text file and an excel file), % p2_text.txt and p2_excel.xls, extracts rate constant data, plots the rate % cosntant as a function of T, and then writes a text and excel file % showing the rate constant values from 300K -> 1500K in increments of 100K % clear the variables/workspace and the command window clear; clc; %%%%%% Read in the text file as a cell-array of strings % Open the text file so Matlab can use it fid = fopen('p2_text.txt'); % Read in the data, turning each line into a string. The "\n" means new % line, so it read until it finds a new line (i.e. reads the whole line) text_data = textscan(fid,'%s','whitespace','\n'); % Convert the cell array returned by textscan into an array of % characters text_char = char(text_data{1}); %determine how many lines of text are present n_lines = length(text_char(:,1)); % Extract the parameter values from the data line: % we make use of the n_lines, since we know the data to be present in the % final line of the file. There are other methods one can use if you don;t % know where the data would be, as long as there is some reference point % you can use (keyword, number, etc.). The "%f" means to read a floating % point number (there are other formats for numbers and strings as well) [Af,n,EaR] = strread(text_char(n_lines,:),'%f %f %f'); %%% Generate k(T) and plot the result % make a vector of Temp values from 300 to 1500 with interval of 100 T = [300:100:1500]; % iterate over the T vector to calculate the k(T) at each value and store % in a vector called k for i=1:length(T) k(i) = Af*T(i)^n*exp(-EaR/T(i)); end % make a semilog y plot of the rate constant and label the axes semilogy(T,k); xlabel('Temperature [K]'); ylabel('k(T) [cm^3/mole-K]'); % closes the file p2_text.txt so it can be used outside of Matlab again fclose all; %%% write the text file % open the specified file with write priviledges fid2 = fopen('text_output.txt','w'); % find the line on which "NH2OH" appears, so we can print this line in the % output file rxn_loc = strmatch('NH2OH',text_char); % Print the text/data to a text file specified by "fid2" % \n means go to a new line, \t means tab over fprintf(fid2,'Rate constant data for: \n'); fprintf(fid2,text_char(rxn_loc,:)); fprintf(fid2,'\n\n'); fprintf(fid2,'Temp (K) \t k(T) (cm3/mole-s) \n'); % this writes two fields on the same line, separated by 2 tabs. The format % is specified by %g (simplest notation) and %e (scientific notation) for i=1:length(T) fprintf(fid2,'%g \t\t %e \n',T(i),k(i)); end fclose all; %%%%%% Start dealing with the Excel file % read in the Excel data; this put the numeric data directly in xls_data, % and puts all other text data in xls_text [xls_data, xls_text]= xlsread('p2_excel.xls'); % Extract the parameter values from the data line Af = xls_data(1); n = xls_data(2); EaR = xls_data(3); % Generate k(T) to be written to the file T = [300:100:1500]; for i=1:length(T) k_xls(i) = Af*T(i)^n*exp(-EaR/T(i)); end %%% write the Excel file % find the location of the reaction again rxn_loc_xls = strmatch('NH2OH',xls_text); % To write to an excel file, the easiest thing to do is create a matrix or % cell array with everything in it, and just write it in one pass. The % first few lines create a cell array with the require data and the final % line writes it. The num2str on the k_xls data was simply used so that % the format could be forced to be scientific notation (optional). xls_mat{1,1}=('Rate constant data for:'); xls_mat{2,1}=xls_text{rxn_loc_xls}; xls_mat{3,1}=(' '); xls_mat{4,1}=('Temp (K)'); xls_mat{4,2}=('k(T) (cm3/mole-s)'); for i=1:length(T) xls_mat{4+i,1}=T(i); xls_mat{4+i,2}=num2str(k_xls(i),'%e'); end xlswrite('xls_output.xls',xls_mat);