2013-08-28 2 views
3

У меня есть данные, хранящиеся в виде текстового файла следующим образом:Matlab чтение текста

1377303313.298551: 1377303312.800000, **40.497522, -74.434818, 0.026000,** PS 

1377303313.320448: R255 1 

1377303313.369429: R255 1 

1377303313.419430: R255 1 

1377303313.468416: R255 1 

1377303313.676656: 1377303313.200000, **40.497521, -74.434819, 0.010000** PS 

1377303313.715420: R255 1 

1377303313.814361: R255 1 

Я хочу, чтобы мой файл выглядеть следующим образом:

1 255 **40.497522 -74.434818 0.026000** 1377303313.320448 

1 255 **40.497522 -74.434818 0.026000** 1377303313.369429 

1 255 **40.497522 -74.434818 0.026000** 1377303313.419430 

1 255 **40.497522 -74.434818 0.026000** 1377303313.468416 

1 255 **40.497521 -74.434819 0.010000** 1377303313.715420 

1 255 **40.497521 -74.434819 0.010000** 1377303313.814361 

Короче говоря, мне нужны смелые части, чтобы быть продолжаются до линий, пока они не достигнут следующего измерения PS, затем повторяйте одно и то же. Я действительно борюсь с этим, я был бы признателен за помощь!

Заранее спасибо.

+1

Можете ли вы подтвердить, что иногда запятая после ваших данных, прежде чем PS, а иногда нет? Или одна из этих строк опечатка? – Geodesic

ответ

1

Я быстро собрал несколько сценариев. Я предположил, что ваш входной файл имеет фиксированный формат, в некотором смысле, что длины значений не меняются между строками. Это облегчает извлечение вещей, которые вам нужны из линий, таких как «полужирные части». Если они не исправлены, регулярные выражения, вероятно, будут необходимы для экстракций, но общая структура сценария не должна изменяться.

disp(' '); 

fname = 'data.txt'; 

% desired output line format 
desiredlineTemplate = '1 255 %s %s\n'; 


boldPart = ''; 

fid = fopen(fname); 

% get first line 
tline = fgets(fid); 

if numel(tline) > 36 
    % check if first line in a file is a PS line 
    % based on its length. 
    % lines with PS are much longer than the lines without PS 
    % so we can use this information 

    % extract the "bold part" 
    boldPart = tline(39:end-4); 

    % remove commas 
    boldPart = strrep(boldPart,',',''); 
end 

while ischar(tline) 

    % disp(tline); 

    if numel(tline) == 1, 
     % enmpty lines have length of 1. At least 
     % when I tried this. If this is not the case for your 
     % text file, u can ignor this bit. 
     tline = fgets(fid); 
     continue; 
    end 


    % lines with PS are much longer than the lines without PS 
    % so we can use this information 
    if numel(tline) > 36 
     % this is a line with PS 
     % so extract "bold part" 
     boldPart = tline(39:end-4); 

     % remove comma 
     boldPart = strrep(boldPart,',',''); 

    else 
     % now we are in a line without PS. Thus need to reformat this line 
     % and add "bold part" extracted earlier. 

     % extract the first number in a line 
     % again based on ints length 
     firstNumber = tline(1:17); 

     % CONSTRUCT THE DISIRED LINE OUTPUT 
     desiredLine = sprintf(desiredlineTemplate, boldPart, firstNumber); 

     disp(desiredLine); 
    end 

    tline = fgets(fid); 

end 

fclose(fid); 

Выход:

>> 
1 255 40.497522 -74.434818 0.026000 1377303313.320448 

1 255 40.497522 -74.434818 0.026000 1377303313.369429 

1 255 40.497522 -74.434818 0.026000 1377303313.419430 

1 255 40.497522 -74.434818 0.026000 1377303313.468416 

1 255 40.497521 -74.434819 0.010000 1377303313.715420 

1 255 40.497521 -74.434819 0.010000 1377303313.814361 
+0

Если числа не имеют одинакового размера, функция fscanf будет полезна. Фактически, fscanf упростит вышеизложенное совсем немного, но я оставлю это кому-то другому, чтобы писать. – Cramer

+0

@Cramer yep, fscanf также можно использовать. – Marcin

+0

Thnaks много! Длина значений меняется между строками, но я буду играть с кодом, который нужно решить! Я ценю это!! – user2727146

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

  • Нет связанных вопросов^_^