2016-05-03 1 views
3

У меня есть несколько файлов GPS, и я хочу объединить их в один файл. Поэтому мне нужно изменить одну запись, так как все начинаются со следа # 1 снова.Текстовые файлы MATLAB меняют несколько записей (цифр) между двумя строками

Вот пример текстового файла:

Трассировка # 1 в положении 0,000000 $ GPGGA, 092105.95,4635.2492567, N, 00823,5402932, E, 1,13,0.8,2355.019, М ,, ,, * 00

Трассировка # 2 в положении 1,000000 $ GPLLQ, 092106.10,042916 ,,,,, 0,13,5.522 ,, * 5D $ GPGGA, 092106.20,4635.2492568, N, 00823,5402891, E, 1 , 13,0,8,2355,020, M ,,,, * 00

След № 1 в позиции 6.000000 $ GPGGA , 092106.70,4635.2492591, N, 00823,5402862, Е, 1,13,0.8,2355.034, М ,,,, * 0A

трассировки # 2 в положении 7,000000 $ GPGGA, 092106.70,4635.2492591, N, +00823,5402862, Е, 1,13,0.8,2355.034, M ,,,, * 0A

Трассировка # 3 в положении 8,000000 $ GPGGA, 092106.70,4635.2492591, N, 00823,5402862, E, 1,13,0.8,2355.034, М ,, ,, * 0A

Мой желаемый результат должен иметь каждый Trace # изменен на инкрементный (Trace #1 к Trace #5). Позиция не должна изменяться, поскольку она не используется для дальнейшей обработки.

Всего у меня около 18000 следов.

+0

Нет. Я могу скопировать их все в один текстовый файл, но должен изменить идентификатор трассировки на непрерывный идентификатор трассы, начиная с 1 до N трасс. –

ответ

1

Вы можете комбинировать fileread и strfind, как показано ниже. По моему опыту, strfind проще в использовании, чем regexp.

%% Read file: 
file_string = fileread('C:\Users\rfpe\Documents\MATLAB\GPS_data.txt'); 

%% Find indices where the word "Trace" starts 
idx = [strfind(file_string, 'Trace'), numel(file_string)]; 

%% Find the indices where the phrase " at" starts 
idx_2 = strfind(file_string, ' at'); 

%% Loop through the lines of the text, and add each line to 
%% separate cells in new_txt 
for n = 1:numel(idx)-1; 
    new_txt{n} = sprintf('%s%i%s', file_string(idx(n):idx(n)+6), ... 
    n, file_string((idx_2(n)):idx(n+1)-1)); 
end 

%% Open new txt file, with writing rights 
fileID = fopen('GPS_data_new.txt','w'); 

%% Print each cell element into the new text file using fprintf 
fprintf(fileID,'%s', new_txt{:}); 

%% Close the open file: 
fclose(fileID); 

Он выводит следующее, для файла с 11 следов:

Trace #1 at position 0.000000 
$GPGGA,092105.95,4635.2492567,N,00823.5402932,E,1,13,0.8,2355.019,M,,,,*00 

Trace #2 at position 1.000000 $GPLLQ,092106.10,042916,,,,,0,13,5.522,,*5D 
$GPGGA,092106.20,4635.2492568,N,00823.5402891,E,1,13,0.8,2355.020,M,,,,*00 

Trace #3 at position 6.000000 
$GPGGA,092106.70,4635.2492591,N,00823.5402862,E,1,13,0.8,2355.034,M,,,,*0A 

Trace #4 at position 7.000000 
$GPGGA,092106.70,4635.2492591,N,00823.5402862,E,1,13,0.8,2355.034,M,,,,*0A 

Trace #5 at position 8.000000 
$GPGGA,092106.70,4635.2492591,N,00823.5402862,E,1,13,0.8,2355.034,M,,,,*0A 

Trace #6 at position 0.000000 
$GPGGA,092105.95,4635.2492567,N,00823.5402932,E,1,13,0.8,2355.019,M,,,,*00 

Trace #7 at position 1.000000 $GPLLQ,092106.10,042916,,,,,0,13,5.522,,*5D 
$GPGGA,092106.20,4635.2492568,N,00823.5402891,E,1,13,0.8,2355.020,M,,,,*00 

Trace #8 at position 6.000000 
$GPGGA,092106.70,4635.2492591,N,00823.5402862,E,1,13,0.8,2355.034,M,,,,*0A 

Trace #9 at position 7.000000 
$GPGGA,092106.70,4635.2492591,N,00823.5402862,E,1,13,0.8,2355.034,M,,,,*0A 

Trace #10 at position 8.000000 
$GPGGA,092106.70,4635.2492591,N,00823.5402862,E,1,13,0.8,2355.034,M,,,,*0A 

Trace #11 at position 0.000000 
$GPGGA,092105.95,4635.2492567,N,00823.5402932,E,1,13,0.8,2355.019,M,,,,*00 
2

Хотя в принципе можно было бы исправить счетчики, во время слияния всех файлов, я думаю, что для ваших случай проще использовать некоторую пост-обработку после окончательного слияния. 1.e, сначала слить все файлы, а затем исправить окончательный файл.

Ниже приведено мое пост-обрабатывающее решение. В словах:

  1. прочитать весь текст в память
  2. поиск строки, которые будут исправлены
  3. разделить эти строки на части, чтобы сохранить и частей, чтобы исправить
  4. делать поправки на соответствующие части
  5. пишите все в файл.

Обратите внимание, что regexp медленнее и немного сложнее, чем strfind, но это позволяет вам быть гораздо более гибким с форматированием. Глупые вещи, такие как случайные ведущие пространства, различное количество пробелов и т. Д. Между разными выходными файлами, вообще не влияют на обработку.Кроме того, regexp позволяет выполнять шаги 2 и 3 за один звонок, делая его намного быстрее и проще, чем strfind.

Во всяком случае, здесь идет:

% Read the file into memory 
fid = fopen('GPS_data.txt', 'r'); 
    txt = textscan(fid, '%s', 'delimiter','\n'); 
    txt = txt{1}; 
fclose(fid); 

% Find relevant lines and separate into tokens 
tok = regexp(txt, ... 
      '^(\s*Trace\s*#\s*)(\d*)(.*)$',... 
      'tokens'); 

% Do the replacements 
matches = ~cellfun('isempty', tok); 
txt(matches) = cellfun(@(x,y)[x{1}{1} int2str(y) x{1}{3}], ...  
         tok(matches),... 
         num2cell(1:nnz(matches))',... 
         'UniformOutput', false); 

% Write results to file     
fid = fopen('GPS_data_corrected.txt', 'w'); 
    fprintf(fid, '%s\n', txt{:}); 
fclose(fid); 

Использование arrayfun или простой цикл позволяет избавиться от num2cell, но да ладно.

Смежные вопросы