2014-06-28 52 views
0

我有大量存儲在多個.net文件中的數據,我想用MATLAB(我現在的版本是R2013a)處理它們。儘管搜索MathWorks網站,但我無法找到任何用於從.net文件導入數據的命令,因爲ncread命令僅適用於.nc文件。在用Notepad ++打開後,文件結構的圖像可以看到here從MATLAB中的.net文件讀取數據

可以看出,該文件的數據由NUL US NUL分開,並以US NUL開頭,即單元分隔符和空字符。我正在尋找一種方法來讀取文件,使得NUL US NUL字符之間的三個條目中的每一個對應於一行的三列。

一種選擇是對我來說,手動使用記事本打開每個文件++和替換\x00\x1f\x00\n,然後打開與Microsoft Excel文件,用空格分隔,並把它保存爲.csv文件,我可以反過來又導入與MATLAB的csvread命令。但是,由於我有近600個.net文件,這似乎不是一個實際的解決方案,僅僅是因爲需要付出的努力。如果有人能夠幫助我解決這方面的問題並提出一種將這些文件讀入MATLAB的高效方法,我將非常感激。非常感謝。

+0

您可以請某些地方的實際數據,所以我們可以嘗試解決方案嗎?謝謝! – darthbith

+0

@darthbith我真的很抱歉,但我無法在線發佈數據或任何代表性樣本。因此,我只能向你展示截圖。 – ACuriousMind

回答

0

這裏是解決方案:

function mat=filetrim(filename,'NUL US NUL') % 
tic 
fid=fopen(filename); 
if (isunix) % Linux or Mac 
    [~, result] = system(['wc -l ', filename]); 
    nl=strcat(regexp(result,'[\d]','match')); 
    numlines = str2double(nl); 

elseif (ispc) % Windows 
    numlines = str2double(perl('countlines.pl', 'your_file')); 

else 
    error('...'); 

end 
tline=fgetl(fid); 
r=regexp(strtrim(tline(7:end-6)),pat,'split');% here I assumed that the line ends with 
               % US NUL. If the line does not end with 
               % US NUL, please change the "end-6" to 
               % "end". 
d=cell2mat(cellfun(@str2num,r,'UniformOutput',false)); 
mat=zeros(numlines,size(d,2)); 
for i=1:size(mat,1) 
    r=regexp(strtrim(tline(7:end-6)),pat,'split'); 
    mat(i,:)=cell2mat(cellfun(@str2num,r,'UniformOutput',false)); 
end 
fclose all; 
toc 
return 

循環找出從「#1」所提供的解決方案之一被改編文件中的行數。這一部分的榮譽歸功於@Rody Oldenhuis。

+0

感謝您的幫助,但您的代碼似乎存在問題。下面是我嘗試執行時收到的錯誤消息:'下標賦值尺寸不匹配'。 'filetrim中的錯誤(第17行)' 'mat(i,:)= cell2mat(cellfun(@ str2num,r, 'UniformOutput',false));' 你可以檢查一下嗎?謝謝! – ACuriousMind

+0

請給我你正在處理的文件。我已經試過了一個示例文件,它工作。我的郵件標識是[email protected] – Naveen

+0

@UserXeTex,我剛纔看到您之前的評論,並瞭解到您無法發送數據文件。做一件事,只需將輸入文件的第一行和最後一行復制到另一個文本文件併發送給我。 – Naveen