2015-08-14 5 views
0

Я работаю с огромными текстовыми файлами данных (.rtf). Данные в файлах состоят из двух столбцов чисел, отформатированных по табличным свойствам. Кроме того, эти цифры либо очень большие, либо очень маленькие, поэтому необходимо иметь очень высокий уровень точности, связанный с этими числами.Импорт данных .rtf в MatLab

Как назначить данные первого столбца «А», а второй - «В»? (Это были бы векторы?) Моя проблема в настоящий момент связана с тем, что форматирование форматированного текста не взаимодействует с импортом в MatLab и преобразование файла .rtf в .txt (затем импорт) объединяет данные обоих столбцов в один столбец чередующейся информации.

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

Так сказать, у меня был этот образец данных в моем файле:

1.0E-5  78.29777 
1.0625E-5 75.9674 
1.125E-5 73.83424 
1.1875E-5 71.87197 
1.25E-5  70.05895 
1.375E-5 66.8116 
1.5E-5  63.9797 
1.625E-5 61.48167 

И мой сингл указанное значение было 1.123E-5, это значение находится ближе всего к 1.125E-5, следовательно, желаемый выход 73,83424.

Как я могу это сделать, я не знаю, с чего начать, поскольку я не знаком с синтаксисом импорта данных MatLab?

Спасибо за помощь!

ответ

0

Вот что я хотел бы сделать: скопировать содержимое в первенствовать или Google электронной таблицы, а затем сохранить в формате .csv, отсюда легко

T = readtable ('путь/к/мои/данные. CSV ');

T теперь содержит ваши номера как двойные поплавки в качестве типа данных табл.

A = T {:, 1}; % столба 1

B = T {:, 2}; % колонка 2

Удачи вам!

+0

работы, спасибо! –

1

Вы можете использовать low level IO с regular expressions, чтобы читать в вашем файле *.rtf и получать данные без какого-либо преобразования. Используя ваши данные образца и файл *.rtf, я уничтожил неуклюжий парсер, который получает ваши данные для вас.Если открыть файл *.rtf в текстовом редакторе, вы увидите, (по крайней мере у меня) он имеет 2 строки заголовка:

{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1033{\fonttbl{\f0\fnil\fcharset0 Calibri;}} 
{\*\generator Riched20 6.3.9600}\viewkind4\uc1 

Вслед за немного более заголовок, который смешивается с вашими данными (может быть просто WordPad обязательно):

\pard\sa200\sl276\slmult1\f0\fs22\lang9 1.0E-5  78.29777\par 

Таким образом, мы пропустить первые две строки, относятся к третьей линии по-разному, а затем справиться с остальными:

fID = fopen('test.rtf', 'r'); % Open our data file 

nheaders = 2; % Number of full header lines 
npartialheaders = 1; % Number of header lines with your data mixed in 

ii = 1; 
mydata = []; 
while ~feof(fID) % Loop until we reach the end of the file 
    if ii <= nheaders 
     % Do nothing 
     tline = fgetl(fID); % Read in a line of data, discard it 
     ii = ii + 1; 
    else 
     tline = fgetl(fID); % Read in a line of data 
     out = regexp(tline, '([\s\d.E-])', 'match'); 

     if ~isempty(out) % Our regex found some data 
      % The regexp returns every character in a cell, concatenate them 
      % and split them along the spaces 
      data_str = strsplit([out{:}], ' '); 

      if ii > nheaders && ii <= (nheaders + npartialheaders) 
       % Header is mixed with your data 
       % We should only want the second and third matches 
       data_num = str2double(data_str(2:3)); 
       mydata = [mydata; data_num]; 
      else 
       % Just your data on these lines 
       data_num = str2double(data_str(1:2)); 
       mydata = [mydata; data_num]; 
      end 
     end 

     ii = ii + 1; 
    end 
end 

fclose(fID); 

который возвращает:

mydata = 

    1.00000000000000e-05 78.2977700000000 
    1.06250000000000e-05 75.9674000000000 
    1.12500000000000e-05 73.8342400000000 
    1.18750000000000e-05 71.8719700000000 
    1.25000000000000e-05 70.0589500000000 
    1.37500000000000e-05 66.8116000000000 
    1.50000000000000e-05 63.9797000000000 
    1.62500000000000e-05 61.4816700000000 

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

Теперь, когда у вас есть данные, я думаю, вы можете работать над выяснением своей второй части. Если вы еще этого не сделали, взгляните на MATLAB's matrix indexing documentation. В качестве намека на одну реализацию взгляните на выходы для min и подумайте, что вы могли бы вычесть константу из вектора.

% What is this doing? It's a mystery! [~, matchidx] = min(abs(mydata(:,1) - querypoint)); disp(mydata(matchidx, 2))

+0

Спасибо за ваше решение, но я не достаточно опытен в MatLab, чтобы понять вашу логику или синтаксис, поэтому я перехожу к более простому решению haha ​​ –

+0

@SterlingButters, которое кажется большим количеством потраченных впустую усилий. – excaza

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