user3489173
user3489173

Reputation: 45

matlab function replacing last part of strings between known characters

I have a text file TF including a set of the following kind of strings:

"linStru.twoZoneBuildingStructure.north.airLeakage.senTem.T", 
"linStru.twoZoneBuildingStructure.north.vol.Xi[1]", 
"linStru.twoZoneBuildingStructure.south.airLeakage.senTem.T",
"linStru.twoZoneBuildingStructure.south.vol.Xi[1]", " 
"linStru.twoZoneBuildingStructure.north_ext.layMul.nMat[1].monoLayer1Nf.T[1]",
"linStru.twoZoneBuildingStructure.north_ext.layMul.nMat[1].monoLayer2Nf.T[2]",

Given a line L, starting from the end let the substring s denote the portion of the string between ," and the first .

To make it clearer, for L=1: s=T, for L=2: s=Xi[1], for L=5: s=T[1], etc.

Given a text file TF in the above format, I want to write a MATLAB function which takes TF and replaces the corresponding s on each line with der(s).

For example, the function should change the above strings as follows:

"linStru.twoZoneBuildingStructure.north.airLeakage.senTem.der(T)", 
"linStru.twoZoneBuildingStructure.north.vol.der(Xi[1])", 
"linStru.twoZoneBuildingStructure.south.airLeakage.senTem.der(T)",
"linStru.twoZoneBuildingStructure.south.vol.der(Xi[1])", " 
"linStru.twoZoneBuildingStructure.north_ext.layMul.nMat[1].monoLayer1Nf.der(T[1])",
"linStru.twoZoneBuildingStructure.north_ext.layMul.nMat[1].monoLayer2Nf.der(T[2])",

How can such a function be written?

Upvotes: 0

Views: 177

Answers (3)

Luis Mendo
Luis Mendo

Reputation: 112759

Another way to do it with regexprep:

str_out = regexprep(str_in, '\.([^\.]+)"$','\.der($1)"');

Example: for

str_in = {'"linStru.twoZoneBuildingStructure.north.airLeakage.senTem.T"' 
       '"linStru.twoZoneBuildingStructure.north.vol.Xi[1]"'};

this gives

str_out = 
    '"linStru.twoZoneBuildingStructure.north.airLeakage.senTem.der(T)"'
    '"linStru.twoZoneBuildingStructure.north.vol.der(Xi[1])"'

Upvotes: 0

rayryeng
rayryeng

Reputation: 104555

I see there is a small " typo on the fourth line of your text file. I'm going to remove this to make things simpler.

As such, the simplest way that I can see you do this is iterate through all of your strings, remove the single quotes, then find the point in your string where the last . occurs. Extract this substring, then manually insert the der() in between this string. Assuming that those strings are in a text file called functions.txt, you would read in your text file using textread to read in individual strings. As such:

names = textread('functions.txt', '%s');

names should now be a cell array of names where each element is each string encapsulated in double quotes. Use findstr to extract where the . is located, then extract the last location of where this is. Extract this substring, then replace this string with der(). In other words:

out_strings = cell(1, numel(names)); %// To store output strings
for idx = 1 : numel(names)
     %// Extract actual string without quotes and comma
     name_str = names{idx}(2:end-2);

     %// Find the last dot
     dot_locs = findstr(name_str, '.');

     %// Last dot location
     last_dot_loc = dot_locs(end);

     %// Extract substring after dot
     last_string = name_str(last_dot_loc+1:end);

     %// Create new string 
     out_strings{idx} = ['"' name_str(1:last_dot_loc) 'der(' last_string ')",'];
end

This is the output I get:

celldisp(out_strings)

out_strings{1} =

"linStru.twoZoneBuildingStructure.north.airLeakage.senTem.der(T)",


out_strings{2} =

"linStru.twoZoneBuildingStructure.north.vol.der(Xi[1])",


out_strings{3} =

"linStru.twoZoneBuildingStructure.south.airLeakage.senTem.der(T)",


out_strings{4} =

"linStru.twoZoneBuildingStructure.south.vol.der(Xi[1])",


out_strings{5} =

"linStru.twoZoneBuildingStructure.north_ext.layMul.nMat[1].monoLayer1Nf.der(T[1])",


out_strings{6} =

"linStru.twoZoneBuildingStructure.north_ext.layMul.nMat[1].monoLayer2Nf.der(T[2])",

The last thing you want to do is write each line of text to your text file. You can use fopen to open up a file for writing. fopen returns a file ID that is associated with the file you want to write to. You then use fprintf to print your strings and name a newline for each string using this file ID. You then close the file using fclose with this same file ID. As such, if we wanted to output a text file called functions_new.txt, we would do:

%// Open up the file and get ID
fid = fopen('functions_new.txt', 'w');

%// For each string we have...
for idx = 1 : numel(out_strings)
    %// Write the string to file and make a new line
    fprintf(fid, '%s\n', out_strings{idx});
end

%// Close the file
fclose(fid);

Upvotes: 1

Ben Voigt
Ben Voigt

Reputation: 283893

Something like

regexprep(TF, '\.([^.]+)",$', '.der($1)",', 'dotexceptnewline', 'lineanchors')

It finds the longest sequence of non-dot characters appearing between a dot before and quote-comma-endline after, and encloses that inside der( ).

Upvotes: 3

Related Questions