2016-05-18 88 views
0

我正在編寫GUI,其中載入包含測量數據的.csv文件。該文件被很好地定義:Matlab:讀取可能有錯誤.csv

<variable>(<unit>),<variable>(<unit>),... 
0.005,NaN,... 

,我處理它在VarsUnitsData:當數據部分被損壞,則會出現

A=importdata('foo.csv',','); 
Data=A.data; 
[Vars,Units]=ProcessHeaderLine(A.colheaders); 

問題 - 有字符串而不是數在細胞:

<variable>(<unit>),<variable>(<unit>),... 
0.005,"- N/A - ",... 

在這種情況下,需要很長的時間來運行importdata功能,並引發錯誤:

Error using importdata (line 136)
Unable to open file.

Error in <.m file> (line 384)
A=importdata('foo.csv'],',');

難道還有比try-catch更快的方式與處理報頭和數據,並能夠處理數據containig串「細胞的能力這種方法「?

+0

MATLAB非常適合處理純數字數據文件。對於字符串數據來說並不是那麼好,並且沒有一個MATLAB讀取器能夠很好地處理可以將記錄類型從一個記錄更改爲下一個記錄的數據。你的例子特別令人煩惱,因爲它顯示不平衡的報價!如果您的「字符串」數據幾乎總是相同的,並且它是實際數據不可用時的標記,那麼最好的解決方案是預處理數據文件。將字符串(在這種情況下,「N/A」)替換爲對您的應用程序無效的數字值(可能是'-1'?也許是'999999'?)。 – gariepy

+0

@gariepy字符串是'「 - N/A - 「'實際上,我可以發現問題,並且我可以半自動地修復它,但是我是唯一一個(在實驗室中)瘋狂地追蹤它並面對它的人。萬無一失的密封黑盒...... – Crowley

+0

其中一個測試文件 - 錯誤的 - 包含整列中的字符串,問題是我不知道爲什麼*有'N/A'標誌關於函數設計我不知道在第二行查找字符串是否足以決定如何處理文件。 – Crowley

回答

1

儘管這是一個MATLAB問題,但Perl是預處理文件的最好方法(並且Perl包含在MATLAB分發版中!)。以下命令行腳本將"- N/A -"替換爲999999。選擇您喜歡的任何替換值,然後在運行importdata()後,在MATLAB中處理它。

perl -pi -e 's/\"- N\/A -\"/999999/g' filename.csv 

注意:這將更改文件就地!確保在嘗試此操作之前製作文件的備份副本。注意2:如果您確實需要使用MATLAB system()調用,則可以從GUI運行此預處理步驟。

1

儘管它更適合於垂直佈局而不是水平佈局的數據,但您可以使用可讀取的函數。

% Use readtable to read the data as a table: 
% The first row is the column names, the second row is the data 
t = readtable('foo.csv', 'ReadVariableNames', false); 

% Use {} brackets to extract from the table 
colheaders = t{1,:}; 
Data = str2double(t{2,:}); 

在這種情況下,str2double將採取任何無效文本,如「 - N/A - 」,並將其轉換爲NaN。