Заменить конкретную строку в текстовом файле - PullRequest
0 голосов
/ 25 октября 2019

У меня есть текстовый файл (например: data.dat), как показано ниже, с количеством строк.

data.dat

@motion parameters
speed= 22,30,60
range= 600
rotation= 50

@controls
act= 2,3,4,5

Я хочу прочитать его и заменить строку, которая идет сразу после строкиначиная с конкретного ключевого слова, например "@controls". В этом случае строка, которая должна быть заменена, это:

act= 2,3,4,5

, и она должна быть изменена в цикле. Например, на мгновение оно изменится на:

act= 1,0,8,-2

Я пробовал это

fullFileName = fullfile(pwd, 'data.dat')
% Open the file.
fileID = fopen(fullFileName, 'rt');
% Read the first line of the file.
textLine = fgetl(fileID);
while ischar(textLine)
  % Read the remaining lines of the file.
    fprintf('%s\n', textLine)
  if startsWith(textLine,'@controls')
    % Line starts with @controls, so change values
      textLine = fgetl(fileID); % Step one line below
      textLine = 'act= %4.1f,%4.1f,%4.1f,%4.1f\n ';
     fprintf(fileID,textLine,act_1,act_2,act_3,act_4);

  end
  % Read the next line.
    textLine = fgetl(fileID);
end
% All done reading all lines, so close the file.
fclose(fileID);

Но это просто удаляет исходную строку!

I 'Буду признателен за вашу помощь. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 25 октября 2019

Если вы не привязаны к этому построчному подходу, можно - например - также использовать fileread и regexp, чтобы получить все строкифайла, измените их и, наконец, сохраните их обратно в файл.

Это будет мое решение:

% Read whole content of file as text
C = fileread('data.dat');

% Split at every new line character; Caveat: Windows vs. Unix vs. MacOS
C = regexp(C, '\r\n', 'split').'

% Find line numbers of @controls lines
idx = find(strcmp('@controls', C))

% Replace following lines with desired values
act = [1, 0, 8, -2; 0, 1, 2, 3];
for id = 1:numel(idx)
  C{idx(id)+1} = sprintf('act= %d,%d,%d,%d', act(id, :));  
end
C

% Save file
fid = fopen('data.dat', 'r+');
fprintf(fid, '%s\r\n', C{:});
fclose(fid);

Я использовал модифицированный data.dat, например:

@motion parameters
speed= 22,30,60
range= 600
rotation= 50

@controls
act= 2,3,4,5

@controls
act= 2,3,4,5

После выполнения приведенного выше сценария результат выглядит следующим образом:

@motion parameters
speed= 22,30,60
range= 600
rotation= 50

@controls
act= 1,0,8,-2

@controls
act= 0,1,2,3

В своем вопросе вы описали желаемый результат как:

act= 1,0,8,-2

Но в вашемкод, который у вас есть

textLine = 'act= %4.1f,%4.1f,%4.1f,%4.1f\n ';

Поэтому, при необходимости, адаптируйте спецификатор формата в соответствии с вашими потребностями.

Надеюсь, это поможет!

0 голосов
/ 27 октября 2019

Я только что понял.

fid = fopen('data.dat','r');        % Open File to read
replaceline = 'act= 1,0,8,-2';      % Line to replace
i = 1;
tline = 's';
A = {[]};
while ischar(tline)
    tline = fgetl(fid);
    if ~isempty(strfind(tline,'@controls')) % find '@controls'
        A{i}=tline;
        A{i+1} = replaceline;               % replace line
        tline = fgetl(fid);
        i = i+1;
    else
        A{i}=tline;
    end
    i = i+1;
end
fclose(fid);
fid2=fopen('data.dat','w');            % Open file to write
for i=1:length(A)-1
    fprintf(fid2,['%s',char([13,10])],A{i});
end
fclose(fid2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...