필터 지우기
필터 지우기

replace first match with a value,second match with a different value etc

조회 수: 4 (최근 30일)
Andrew
Andrew 2013년 1월 22일
I have a txt with 2000 lines.In this txt EE1 appears 100 times.If i want to change the first EE1 i found with a value from a matrix (100,1) the second EE1 i found with the second value from the same matrix (100,1) and the third EE1 i found with the third value from the same matrix (100,1) ,etc ,how can i do it?
This follow code is a mix from something i found and the help of Jan Simon. It replaces only the first EE1 in the txt.
close all; clear; clc % Set user specific paths and values % ====================================================================== HFSS_EXE_PATH='C:\Program Files (x86)\Ansoft\HFSS12'; SCRIPT_PATH='c:\HFSS\scriptttt.vbs'; NEW_VBS_FILE='c:\HFSS\scrip.vbs'; % ======================================================================
for wg_y=6:1:8
% Replace first occurrence of ΕΕ1
fid1=fopen(SCRIPT_PATH,'r+');
vbs_str=fscanf(fid1,'%c');
old_str=('Array("NAME:XSize", "Value:=", "EE1"');
new_str=sprintf('Array("NAME:XSize", "Value:=", "%1.0fmm")',wg_y);
index = strfind(vbs_str, old_str);
new_vbs_str = [vbs_str(1:index(1) - 1), new_str, vbs_str(index(1) + length(old_str):end)];
% Create updated VB script file
fid=fopen(NEW_VBS_FILE,'w'); fprintf(fid,'%s',new_vbs_str); fclose(fid);
end
  댓글 수: 2
Andrew
Andrew 2013년 1월 22일
the txt is like
"Nominal"), "M44m:=", Array("Nominal"), "M44p:=", Array("Nominal"), "N1p:=", Array( _
"Nominal"), "N2p:=", Array("Nominal"), "N2m:=", Array("Nominal"), "N3p:=", Array( _
"Nominal"), "N3m:=", Array("Nominal"), "N4p:=", Array("Nominal"), "O1m:=", Array( _
"Nominal"), "O3p:=", Array("Nominal"), "O4m:=", Array("Nominal"), "O4p:=", Array( _
"Nominal")), Array("X Component:=", "Freq", "Y Component:=", Array( _
"dB(PeakGain)")), Array()
oModule.ExportImageToFile "XY Plot 2", "C:/HFSS/scripts/3001.jpg", 0, 0
oModule.ExportToFile "XY Plot 2", "C:/HFSS/scripts/4001.txt"
oProject.Save
oEditor.ChangeProperty Array("NAME:AllTabs", Array("NAME:Geometry3DCmdTab", Array("NAME:PropServers", _ "E1:CreateBox:1"), Array("NAME:ChangedProps", Array("NAME:XSize", "Value:=", "EE1")))) oProject.Save oDesign.AnalyzeAll Set oModule = oDesign.GetModule("ReportSetup") oModule.CreateReport "XY Plot 1", "Terminal Solution Data", "Rectangular Plot", _ "Setup1 : Sweep1", Array("Domain:=", "Sweep"), Array("Freq:=", Array("All"), "A2m:=", Array( _ "Nominal"), "A2p:=", Array("Nominal"), "A4p:=", Array("Nominal"), "A3m:=", Array( _ "Nominal"), "A3p:=", Array("Nominal"), "B3m:=", Array("Nominal"), "B2m:=", Array( _ "Nominal"), "C3m:=", Array("Nominal"), "C3p:=", Array("Nominal"), "C2m:=", Array( _ "Nominal"), "C2p:=", Array("Nominal"), "C1p:=", Array("Nominal"), "C4p:=", Array( _ "Nominal"), "D1m:=", Array("Nominal"), "D2p:=", Array("Nominal"), "E1p:=", Array( _<<http://mathworks.com/matlabcentral/images/surf.gif>>
Jan
Jan 2013년 1월 22일
@Andrew: The format of your text is not clear.

댓글을 달려면 로그인하십시오.

답변 (3개)

Cedric
Cedric 2013년 1월 22일
편집: Cedric 2013년 1월 22일
Here is a funny one-liner for you, that could be adapted to your needs:
>> str = 'abc EE1 d EE1 00EE100' ; % Dummy example.
>> num = [10, 20, 34] ;
>> sprintf(regexprep(str, 'EE1', '%1.0fmm'), num)
ans = abc 10mm d 20mm 0034mm00
.. but you would have to tell us a bit more about the nature of your "numbers". Is this format '%1.0f' the one that you need, and do you also need to add 'mm' ?
EDIT: just to be clear, if the 100 occurrences of EE1 belong to the same file and your 100 numeric values are stored in a vector called wg_y, your code should be something like that:
fid = fopen(SCRIPT_PATH, 'r+') ;
vbs_str = fscanf(fid, '%c') ;
fclose(fid) ;
new_vbs_str = sprintf(regexprep(vbs_str, 'EE1', '%1.0fmm'), wg_y) ;
fid = fopen(NEW_VBS_FILE, 'w') ;
fprintf(fid, '%s', new_vbs_str) ;
fclose(fid) ;
Cheers,
Cedric
  댓글 수: 7
Andrew
Andrew 2013년 1월 22일
i emailed to you the txt file
Jan
Jan 2013년 1월 22일
@Andrew: You have asked before you sent data by mail. I really appreciate this. Some other users think, that their problem is more important than the spare time of the ones they want a solution from.

댓글을 달려면 로그인하십시오.


Jan
Jan 2013년 1월 22일
Equivalent to regexprep:
ResultString = sprintf(strrep(OriginalString, 'EE1', '%1.0fmm'), Value)
  댓글 수: 1
Cedric
Cedric 2013년 1월 24일
Actually, as I had never really used strrep (I might be too regexp-addicted for that ;-)), I just looked at the doc. now that I read your answer, and saw that strrep has an interesting behavior with overlapping occurrences of the pattern. Certainly something that I should keep in mind!
>> strrep( 'AAA', 'AA', 'Hello' )
ans = HelloHello
>> regexprep( 'AAA', 'AA', 'Hello' )
ans = HelloA

댓글을 달려면 로그인하십시오.


Julian
Julian 2013년 1월 22일
Did you consider using regular expressions, e.g.
regexprep('some text ee1 some more text ee1 ee1', 'ee1', {'FIRST' 'SECOND' 'THIRD'}, 'once')
ans =
some text FIRST some more text SECOND THIRD
  댓글 수: 3
Cedric
Cedric 2013년 1월 22일
I know what it is, it happens to me all the time, especially when I open multiple threads all at once in multiple tabs ;-)
Andrew
Andrew 2013년 1월 22일
EE1 is not in the same line ...i just added a part of the txt

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Text Data Preparation에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by