Если файл настолько коротка, вы не должны читать построчно. Просто прочитайте всю вещь в одной переменной, измените только необходимую ее часть перед каждой записью, а затем запишите полную переменную за один раз.
%% // read the full file as a long sequence of 'char'
fid = fopen ('Air.SIT');
fulltext = fread(fid,Inf,'char') ;
fclose(fid) ;
%% // add a few blank placeholder (3 exactly) to hold the 4 digits when we'll be counting 5000
fulltext = [fulltext(1:49) ; 32 ; 32 ; 32 ; fulltext(50:end) ] ;
idx2replace = 50:53 ; %// save the index of the characters which will be modified each loop
%% // Go for it
baseFileName = 'AIR_%d.SIT' ;
for iFile = 1:1000:5000
%// build filename
filename = sprintf(baseFileName,iFile);
%// modify the string to write
fulltext(idx2replace) = num2str(iFile,'%04d').' ; %//'
%// write the file
fidw = fopen(filename , 'w') ;
fwrite(fidw,fulltext) ;
fclose(fidw) ;
end
Этот пример работает с текстом в вашем примере, вы, возможно, придется немного скорректировать показатели персонажей, чтобы заменить, если ваш реальный случай индивидуален.
Также я задал шаг 1000 для цикла, чтобы вы могли попробовать и посмотреть, работает ли он, не пиши 1000 файлов. Когда вы удовлетворены результатом, удалите 1000 шагов в цикле for.
Редактировать:
Формат спецификатор %04d
Я дал в первом растворе обеспечить выход будет принимать 4-х символов, и это будет прокладка любого меньшего числа с нулевым (например: 23 =>0023
). Иногда желательно, чтобы длина была постоянной, и в вашем конкретном примере это упростило ситуацию, потому что выходная строка была бы одинаковой длины для всех файлов.
Однако это необязательно, если вы не хотите, чтобы номер цикла был заполнен нулем, вы можете использовать простой формат %d
. Это будет использовать только необходимое количество цифр.
Побочный эффект заключается в том, что выходная строка будет иметь разную длину для другого номера цикла, поэтому мы не можем использовать одну строку для всех итераций, мы должны воссоздать строку на каждой итерации. Таким образом, простые модификации следуют. Держите первый абзац решения выше, как есть, и заменить последние 2 абзаца следующим текстом:
%% // prepare the block of text before and after the character to change
textBefore = fulltext(1:49) ;
textAfter = fulltext(51:end) ;
%% // Go for it
baseFileName = 'AIR_%d.SIT' ;
for iFile = 1:500:5000
%// build filename
filename = sprintf(baseFileName,iFile);
%// rebuild the string to write
fulltext = [textBefore ; num2str(iFile,'%d').' ; textAfter ]; %//'
%// write the file
fidw = fopen(filename , 'w') ;
fwrite(fidw,fulltext) ;
fclose(fidw) ;
end
Примечание: Постоянная длина символа для ряда не может иметь важное значение в файле, но это может быть очень полезно для имен ваших файлов, которые будут называться AIR_0001 ... AIR_0023 ... AIR_849 ... AIR_4357
и т. д. ... потому что в списке они будут отображаться правильно упорядоченным в любых окнах проводника.
Если вы хотите, чтобы ваши файлы с именем с постоянными числами длины, просто использовать:
baseFileName = 'AIR_%04d.SIT' ;
вместо текущей строки.
Должно быть, это должно быть в MATLAB? В linux (untested): 'for i in {1..5000}; do sed -i 's/2/$ {i}/g' AIR.txt> AIR $ {i} .txt; done' – kmac
- ваш текстовый файл намного дольше, чем ваш пример, или это просто? – Hoki
Это просто. Но формат немного отличается. Фактическое положение, которое я хочу изменить, находится в строке 3, столбец 25 ~ 28. Например. в цикле 1 текущее число 2 будет заменено тремя пробелами и номером 1. – James