2015-08-14 125 views
0

我正在處理大量的富文本數據文件(.rtf)。文件中的數據由兩列數字組成,這些數字用類似表格的屬性格式化。此外,這些數字要麼非常大,要麼非常小,所以需要與這些數字相關的高精度級別。將.rtf數據導入MatLab

如何將第一列的數據分配爲「A」,將第二列的數據分配爲「B」?(這些是矢量嗎?)我現在的問題與富文本格式化不與導入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

這裏是我會做:將內容複製到Excel或谷歌電子表格,然後保存爲.csv,從這裏可以很容易

T = readtable('路徑/要/我的/數據。 CSV');

T現在包含您的數字作爲雙浮點數作爲表數據類型。

A = T {:, 1}; %列1

B = T {:, 2}; %列2

祝你好運!

+0

作品,謝謝! –

1

您可以使用low level IOregular expressions來讀取您的*.rtf文件,並在沒有任何轉換的情況下獲取您的數據。使用您的示例數據和*.rtf文件,我彙集了一個笨重的解析器,它可以爲您提供數據。如果您在文本編輯器打開你的*.rtf文件,你會發現(至少在我的)它有2個標題行:

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

其次是與您的數據混合在一起多一點頭(可能只是一個寫字板失敗):

\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的matrix indexing documentation。作爲一個實現的提示,請查看min的輸出,並考慮您可以從矢量中減去常數。

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

+0

感謝您的解決方案,但我沒有足夠的經驗在MatLab中理解您的邏輯或語法,所以我將採用更簡單的解決方案,哈哈 –

+0

@SterlingButters,這似乎是很多浪費的努力。 – excaza