如何在文本文件中找到一个不完全已知的字符串,并在matlab中替换它?

如何在文本文件中找到一个不完全已知的字符串,并在matlab中替换它?,matlab,text,replace,find,Matlab,Text,Replace,Find,我有一个相当大的文本文件,其中一个像下面这样的字符串重复了50次 NODE LABEL="NODE-1", LENGTH=(0.001,0.69, 1.805, 5, 10, \ 这些重复字符串之间的唯一区别是=()后面的第一个数字 我的意思是字符串如下所示: NODE LABEL="NODE-1", LENGTH=(0.001,0.69, 1.805, 5, 10, \ NODE LABEL="NODE-2", LENGTH=(0.005,0.69, 1.805, 5, 10, \ NODE

我有一个相当大的文本文件,其中一个像下面这样的字符串重复了50次

NODE LABEL="NODE-1", LENGTH=(0.001,0.69, 1.805, 5, 10, \
这些重复字符串之间的唯一区别是
=(
)后面的第一个数字

我的意思是字符串如下所示:

NODE LABEL="NODE-1", LENGTH=(0.001,0.69, 1.805, 5, 10, \
NODE LABEL="NODE-2", LENGTH=(0.005,0.69, 1.805, 5, 10, \
NODE LABEL="NODE-3", LENGTH=(0.067,0.69, 1.805, 5, 10, \
我在MATLAB中有一个向量,如下所示:

d =[0.010
    0.120
    0.140]
首先,我想识别那些包含上述字符串的行。然后,我需要用向量
d
中相应的数字替换文本文件每行中的第一个数字。 这意味着,我的输出文本文件如下所示:

Bla Bla Bla Bla
NODE LABEL="NODE-1", LENGTH=(0.010,0.69, 1.805, 5, 10, \
Bla Bla Bla Bla
Bla Bla Bla Bla
NODE LABEL="NODE-2", LENGTH=(0.012,0.69, 1.805, 5, 10, \
Bla Bla Bla Bla
NODE LABEL="NODE-3", LENGTH=(0.014,0.69, 1.805, 5, 10, \
我怎么做


我的问题的实质是,如何在文本文件中找到像
LENGTH=(NUMBER,
)这样的字符串,而
NUMBER
是未知的。

在您的问题中,不清楚id输入文件可以包含没有“LENGTH=(”字符串)的行

我想可以

给定指定的输入文件行的格式,您可以:

  • 使用
    findstr
  • 再次使用
    findstr
  • 将字符串部分替换为“d”数组中的数字,并将其转换为字符串
此方法已在以下代码中实现;还添加了关于要修改的行数的“d”数组中的值数检查

我使用了一个输入文件,其中包含不带“LENGTH=”(“string”)的行;在本例中,原始字符串写入输出文件

输入文件

NODE LABEL="NODE-1", LENGTH=(0.001,0.69, 1.805, 5, 10, \
NODE LABEL="NODE-2", LENGTH=(0.005,0.69, 1.805, 5, 10, \
NODE LABEL="NODE-3", WIDTH=(0.005,0.69, 1.805, 5, 10, \
NODE LABEL="NODE-4", XXXX=(0.005,0.69, 1.805, 5, 10, \
NODE LABEL="NODE-5", YYYYYYYY=(0.067,0.69, 1.805, 5, 10, \
NODE LABEL="NODE-6", LENGTH=(0.005,0.69, 1.805, 5, 10, \
NODE LABEL="NODE-1", LENGTH=(0.010,0.69, 1.805, 5, 10, \
NODE LABEL="NODE-2", LENGTH=(0.120,0.69, 1.805, 5, 10, \
NODE LABEL="NODE-3", WIDTH=(0.005,0.69, 1.805, 5, 10, \
NODE LABEL="NODE-4", XXXX=(0.005,0.69, 1.805, 5, 10, \
NODE LABEL="NODE-5", YYYYYYYY=(0.067,0.69, 1.805, 5, 10, \
NODE LABEL="NODE-6", LENGTH=(0.140,0.69, 1.805, 5, 10, \
脚本

% Define the array with replacing values
d =[0.010
   0.120
   0.140];
% Get the number of possible replaceable input file strings
n_val=length(d);
% Open INPUT and OUTPUT files
fp_in=fopen('in_file.txt','rt')
fp_out=fopen('out_file.txt','wt')
% Initialize counter
cnt=1;
% Read the input file line by line
while(1)
   tline = fgetl(fp_in)
   if(ischar(tline))
      % If current input line contains the "LENGTH=(" string, try to
      % replace the number
      if(findstr(tline,'LENGTH=('))
         % If "d" array does not contains enough values, generate error
         % message
         if(cnt > n_val)
            error('Not enough values in "d" array')
         end
         % Replace the number in the string with a value from "d" array
         b=findstr(tline,'(')
         c=findstr(tline,',')
         tline(b+1:c(2)-1)=sprintf('%4.3f',d(cnt))
         % Print the modified line in the OUTPUT file
         fprintf(fp_out,'%s\n',tline)
         % Increment the counter
         cnt=cnt+1
      else
         % If the current line does not contains the "LENGTH=(" string,
         % writhe the line in the OUTPUT file as it is 
         fprintf(fp_out,'%s\n',tline)
      end
   else
      % Stop reading INPUT file
      break
   end
end
% Close INPUT and OUTPUT files
fclose(fp_in);
fclose(fp_out);
输出文件

NODE LABEL="NODE-1", LENGTH=(0.001,0.69, 1.805, 5, 10, \
NODE LABEL="NODE-2", LENGTH=(0.005,0.69, 1.805, 5, 10, \
NODE LABEL="NODE-3", WIDTH=(0.005,0.69, 1.805, 5, 10, \
NODE LABEL="NODE-4", XXXX=(0.005,0.69, 1.805, 5, 10, \
NODE LABEL="NODE-5", YYYYYYYY=(0.067,0.69, 1.805, 5, 10, \
NODE LABEL="NODE-6", LENGTH=(0.005,0.69, 1.805, 5, 10, \
NODE LABEL="NODE-1", LENGTH=(0.010,0.69, 1.805, 5, 10, \
NODE LABEL="NODE-2", LENGTH=(0.120,0.69, 1.805, 5, 10, \
NODE LABEL="NODE-3", WIDTH=(0.005,0.69, 1.805, 5, 10, \
NODE LABEL="NODE-4", XXXX=(0.005,0.69, 1.805, 5, 10, \
NODE LABEL="NODE-5", YYYYYYYY=(0.067,0.69, 1.805, 5, 10, \
NODE LABEL="NODE-6", LENGTH=(0.140,0.69, 1.805, 5, 10, \

希望这有帮助。

查找正则表达式。您可以将它们用于此目的。好的,它工作正常。使用权限“w”和“wt”打开输出文件有什么区别?当我使用第一个时,输出文件中的行在同一行上连续打印。而使用最后一个权限在t上打印t行下一(新)行。Addind
t
指定必须在
文本模式下打开文件。这不应是将输出写入一行的原因。on
write
添加
t
意味着在输出中的任何换行符之前插入回车符(请参阅)。