2012-08-23 210 views
0

我有称为参考一个“父”的文本文件,它是:优化此代码?

VERSION 3.82 
CALCULATION 3 
OPTIONS 0 
PROJNAME 
DATE 
ENGINEER 
NOTES "" 
PASSWORD 
MSTART CONSTANTS 
RHO 1.225 
RHOW 1027 
VISCOS .0000182 
GRAVITY 9.81 
MEND 

MSTART WINDND 
SPMODEL 7 
NLAT 31 
NVER 45 
LATDIM 150 
VERDIM 220 
LONGLS 340.2 
LATLS 0 
VERTLS 0 
XLV 113.4 
YLV 0 
ZLV 0 
XLW 27.72 
YLW 0 
ZLW 0 
LAMBDA1 0 
CohScale 12 
COHDEC 3 
SCALE 33.6 
GAMMA 3.9 
YDIML 0 
N2 32 
YDIMS 0 
K1MIN 3 
LENGTH 1830 
STEP .2233888 
UBAR 3 
SEED 12 
OUTFILE None 
DIAM 0 
HUBHT 0 
TURBHTTYPE 0 
TURBBOTTOM 0 
GUSTAVT 0 
GUSTSPEED 0 
TOLERANCE 0 
DLONGMIN 0 
DLONGMAX 0 
Z0MIN 0 
Z0MAX 0 
MAXITER 14 
MAXSEED 100 
NFILES 1 
UseWindShear 0 
WVMODEL 0 
MATCHFILE '' 
SPACING 0 
SAMPLEFREQ 0 
MEANSPEED 0 
ILAT 0 
IVERT 0 
GUSTMETHOD 0 
DLONG 0 
ILAT 0 
IVERT 0 
LONGGUST 0 
LATGUST 0 
VERTGUST 0 
iLONGGUST 0 
iLATGUST 0 
iVERTGUST 0 
PEAKINESS 0 
MAXFRAN 0 
MEND 

0CONSTANTS 
0WINDND 

的想法是,以产生一组类似的文件,仅改变4个确定的上述文件的行(LENGTH,STEP,UBAR,SEED )。

目前我使用此代码:

clc 
clear all 
close all 


V = [4 6 8 10 12 14 16 18 20 22 24 26 28 29]; 


for j = 1:6 
f1 = ['D:\01_department\DLC1-2'] 
if exist(f1,'dir') ~= 7 
    mkdir(f1); 
end 
fname = [f1 '\' 's0' num2str(j)]; 
if exist(fname,'dir') ~= 7 
    mkdir(fname); 
end 
for i = 1:length(V), 
filename = [fname '\' num2str(V(i)) '.$PJ']; 
fid = fopen(filename,'w'); 
fprintf(fid, 'VERSION 3.82\r\n') 
fprintf(fid, 'CALCULATION 3\r\n') 
fprintf(fid, 'OPTIONS 0\r\n') 
fprintf(fid, 'PROJECTNAME\t\r\n') 
fprintf(fid, 'DATE\t\r\n') 
fprintf(fid, 'ENGINEER\t\r\n') 
fprintf(fid, 'NOTES\t""\r\n') 
fprintf(fid, 'PASSWORD\t\r\n') 
fprintf(fid, 'MSTART CONSTANTS\r\n') 
fprintf(fid, 'RHO 1.225\r\n') 
fprintf(fid, 'RHOW 1027\r\n') 
fprintf(fid, 'VISCOS 0.0000182\r\n') 
fprintf(fid, 'GRAVITY 9.81\r\n') 
fprintf(fid, 'MEND\r\n') 
fprintf(fid, '\r\n') 
fprintf(fid, 'MSTART WINDND\r\n') 
fprintf(fid, 'SPMODEL 7\r\n') 
fprintf(fid, 'NLAT 31\r\n') 
fprintf(fid, 'NVER 45\r\n') 
fprintf(fid, 'LATDIM 150\r\n') 
fprintf(fid, 'VERDIM 220\r\n') 
fprintf(fid, 'LONGLS 340.2\r\n') 
fprintf(fid, 'LATLS 0\r\n') 
fprintf(fid, 'VERTLS 0\r\n') 
fprintf(fid, 'XLV 113.4\r\n') 
fprintf(fid, 'YLV 0\r\n') 
fprintf(fid, 'ZLV 0\r\n') 
fprintf(fid, 'XLW 27.72\r\n') 
fprintf(fid, 'YLW 0\r\n') 
fprintf(fid, 'ZLW 0\r\n') 
fprintf(fid, 'LAMBDA1 0\r\n') 
fprintf(fid, 'CohScale 12\r\n') 
fprintf(fid, 'COHDEC 3\r\n') 
fprintf(fid, 'SCALE 33.6\r\n') 
fprintf(fid, 'GAMMA 3.9\r\n') 
fprintf(fid, 'YDIML 0\r\n') 
fprintf(fid, 'N2 32\r\n') 
fprintf(fid, 'YDIMS 0\r\n') 
fprintf(fid, 'K1MIN 3\r\n') 
fprintf(fid, 'LENGTH %g\r\n', V(i)*610) 
fprintf(fid, 'STEP %g\r\n', V(i)/13.4295) 
fprintf(fid, 'UBAR %g\r\n', V(i)) 
fprintf(fid, 'SEED %i\r\n', randi(999,1)) 
fprintf(fid, 'OUTFILE None\r\n') 
fprintf(fid, 'DIAM 0\r\n') 
fprintf(fid, 'HUBHT 0\r\n') 
fprintf(fid, 'TURBHTTYPE 0\r\n') 
fprintf(fid, 'TURBBOTTOM 0\r\n') 
fprintf(fid, 'GUSTAVT 0\r\n') 
fprintf(fid, 'GUSTSPEED 0\r\n') 
fprintf(fid, 'TOLERANCE 0\r\n') 
fprintf(fid, 'DLONGMIN 0\r\n') 
fprintf(fid, 'DLONGMAX 0\r\n') 
fprintf(fid, 'Z0MIN 0\r\n') 
fprintf(fid, 'Z0MAX 0\r\n') 
fprintf(fid, 'MAXITER 14\r\n') 
fprintf(fid, 'MAXSEED 100\r\n') 
fprintf(fid, 'NFILES 1\r\n') 
fprintf(fid, 'UseWindShear 0\r\n') 
fprintf(fid, 'WVMODEL 0\r\n') 
fprintf(fid, 'MATCHFILE %c\r\n', '') 
fprintf(fid, 'SPACING 0\r\n') 
fprintf(fid, 'SAMPLEFREQ 0\r\n') 
fprintf(fid, 'MEANSPEED 0\r\n') 
fprintf(fid, 'ILAT 0\r\n') 
fprintf(fid, 'IVERT 0\r\n') 
fprintf(fid, 'GUSTMETHOD 0\r\n') 
fprintf(fid, 'DLONG 0\r\n') 
fprintf(fid, 'ILAT 0\r\n') 
fprintf(fid, 'IVERT 0\r\n') 
fprintf(fid, 'LONGGUST 0\r\n') 
fprintf(fid, 'LATGUST 0\r\n') 
fprintf(fid, 'VERTGUST 0\r\n') 
fprintf(fid, 'iLONGGUST 0\r\n') 
fprintf(fid, 'iLATGUST 0\r\n') 
fprintf(fid, 'iVERTGUST 0\r\n') 
fprintf(fid, 'PEAKINESS 0\r\n') 
fprintf(fid, 'MAXFRAN 0\r\n') 
fprintf(fid, ' MEND\r\n') 
fprintf(fid, '\r\n') 
fprintf(fid, '0CONSTANTS\r\n') 
fprintf(fid, '0WINDND\r\n') 
fclose(fid) 
end 
end 

但是这样一来,代码花费大部分时间以书面形式输出。我想更多的做同样的只读参考文件(fopen()函数或其它命令)和变化(打印)仅

fprintf(fid, 'LENGTH %g\r\n', V(i)*610) 
fprintf(fid, 'STEP %g\r\n', V(i)/13.4295) 
fprintf(fid, 'UBAR %g\r\n', V(i)) 
fprintf(fid, 'SEED %i\r\n', randi(999,1)) 

新的文件中。

有没有人有一个想法如何实现这个结果?如果可能的话,我也想矢量化而不是使用for循环。

否则,我在想这种过程: 我感谢你的答案,并与我分享代码。你可能注意到代码是由块组成的:它们以“MSTART”开始并以“MEND”结束;每个MSTART后跟单个块的标签/名称。

在这种情况下,块是CONSTANTS和WINDND。我不知道这是可能的:

1.read the parent file; 
2.find the different block the parent file presents; 
3.store the information/strings of each block in a Matlab structure; 
4.write new files just recalling the blocks of the parent file; 
5.look for strings LENGTH, STEP, UBAR, SEED; 
6.update the above string with the corresponding formula; 
7.store in a specified folder. 

代码的开头是:

%# read lines 
fid = fopen('file.txt','rt'); 
C = textscan(fid, '%s', 'Delimiter','\r\n'); 
C = C{1}; fclose(fid); 

%# start/end of each structure 
startIdx = find(ismember(C, 'MSTART')); 
endIdx = find(ismember(C, 'MEND')); 

但后来我不知道怎么去,因为我只用Matlab一大一,尤其是文本/结构操作。

我希望你能耐心等待我。

问候。

我提前感谢大家。

最亲切的问候, 弗朗切斯科

+0

所以我把它们作为一些其他程序的配置文件。设置的顺序是否重要,或者它们可以以任何顺序? –

+0

查看编辑我的答案。这在这里工作(R2010a)。如果您有任何问题,请告诉我。 –

+2

你为什么要在Matlab内做到这一点?例如在Linux上,您可以使用像sed这样的工具轻松替换部分文本文件 – steabert

回答

1

这应该工作:

clc, clear all, close all 

V = [4 6 8 10 12 14 16 18 20 22 24 26 28 29]; 


fid = fopen('parent.txt', 'r'); 
C = textscan(fid,'%s', 'delimiter', '\r\n'); 
C = C{1}; 
fclose(fid); 

D = C; 
for j = 1:6 
    f1 = 'd:\01_department\dlc1-2'; 
    if exist(f1,'dir') ~= 7, mkdir(f1); end 

    fname = [f1 '\' 's0' num2str(j)]; 
    if exist(fname,'dir') ~= 7, mkdir(fname); end 

    for i = 1:numel(v) 
     filename = [fname '\' num2str(V(i)) '.$pj']; 

     D{strncmp('LENGTH', c, length('LENGTH'))} = ... 
      sprintf('length %g', V(i)*610); 

     D{strncmp('STEP', c, length('STEP'))} = ... 
      sprintf('STEP %g', V(i)/13.4295); 

     D{strncmp('UBAR', c, length('UBAR'))} = ... 
      sprintf('UBAR %g', V(i)); 

     D{strncmp('SEED', c, length('SEED'))} = ... 
      sprintf('SEED %i', randi(999,1)); 


     fid = fopen(filename,'w');   
     txt = sprintf([repmat('%s\r\n',1,size(d,1)),'\r\n'],d{:});   
     fprintf(fid, '%s', txt);   
     fclose(fid); 

    end 
end 

这能够进一步提高 - 字符串被替换是理想的矢量化,和/或仅在命令中输入一次。但是,哦,这应该已经给你一个显着的提速。

+0

我想文件的结构保持不变;不幸的是,目前我没有免费许可证(因为这些许可证是浮动的),所以如果你能提供给我一段代码,我将不胜感激:)谢谢 – fpe

+0

它的工作;唯一的缺点是\ r在repmat中丢失了('%s \ n',1,size(d,1));我将它改为repmat('%s \ r \ n',1,size(d,1))。非常感谢!!! – fpe

+0

@FrancescoPerrone是的,我来自'\ n'意思是换行(Linux)的地方,'\ r \ n'是一个容易忘记的麻烦,在与世界其他地方沟通时需要注意。 Windows):)无论如何,很高兴它现在可以正常工作。 –