2014-11-19 2 views
0
AIR, ID 

AIR.SIT 

    50 1 1 1 0 0 2 1 

    43.57 -116.24  1. 857.7 

Привет, Все,Измените значение определенного положения в текстовом файле в Matlab

У меня есть текстовый файл, как выше. Теперь в Matlab я хочу создать 5000 текстовых файлов, изменив число «2» (конкретный номер в 3-й строке) от 1 до 5000 в каждом файле, сохраняя при этом другое содержимое. В каждом цикле измененное число совпадает с номером цикла. И вывод в каждом цикле сохраняется в новом текстовом файле с именем типа AIR_LoopNumber.SIT.

Я потратил некоторое время на это. Но это немного сложно для новичка. Вот что у меня есть:

% - Read source file. 

fid = fopen ('Air.SIT'); 

n = 1; 

textline={}; 

while (~feof(fid)) 
    textline(n,1)={fgetl(fid)};  
end 

FileName=Air; 


% - Replace characters when relevant. 

for i = 1 : 5000 

    filename = sprintf('%s_%d.SIT','filename',i); 


end 

Любой может помочь в завершении программы?

Спасибо, Джеймс

+0

Должно быть, это должно быть в MATLAB? В linux (untested): 'for i in {1..5000}; do sed -i 's/2/$ {i}/g' AIR.txt> AIR $ {i} .txt; done' – kmac

+0

- ваш текстовый файл намного дольше, чем ваш пример, или это просто? – Hoki

+0

Это просто. Но формат немного отличается. Фактическое положение, которое я хочу изменить, находится в строке 3, столбец 25 ~ 28. Например. в цикле 1 текущее число 2 будет заменено тремя пробелами и номером 1. – James

ответ

0

Если файл настолько коротка, вы не должны читать построчно. Просто прочитайте всю вещь в одной переменной, измените только необходимую ее часть перед каждой записью, а затем запишите полную переменную за один раз.

%% // 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' ; 

вместо текущей строки.

+0

Хоки, большое спасибо. На самом деле мне не нужны пустые заполнители. Однако есть еще один вопрос. На выходе замененный текст похож на 0001, 0002 и др. Как я могу пересмотреть код, чтобы позволить 0001 быть тремя пробелами, за которыми следует 1? – James

+0

@James. Ответ отредактирован. Наслаждайтесь;) – Hoki

+0

Спасибо, Хоки, Это очень полезно для новички, как я. Извините, у меня недостаточно репутации, чтобы проголосовать. – James