2015-04-07 76 views
0

我有一堆CSV文件在Matlab中閱讀。所有文件具有相似的結構,除了最後一個字段是可選的。即一些文件包含它,另一些則不包含。如何在Matlab中讀取具有可變行長度的文本文件?

此外,文件同時包含文本和數字字段,因此csvread不適用。

我只知道替代方法是textscan。不幸的是,我找不到可選字段的說明符。

我在看規格:

formatSpec = '%d%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%s%[^\n\r]'; 

,並希望最後%s是可選的。

+0

我想你可以使用[xlsread](http://se.mathworks.com/help/matlab/ref/xlsread.html)。該功能旨在用於Excel表格,但我認爲它應該工作。 – patrik

回答

0

要讀取文件中的行由行,你可以使用函數fgetl。它讀取一行,刪除換行符並將該行作爲字符串返回。在文件結尾處,返回-1

然後,您可以使用sscanf根據您的格式規範(包括%s)提取數據。如果您的輸入數據最後沒有包含任何字符串,則最後一個字段爲空。

fid = fopen('file.txt','r'); 
while 1 
    line = fgetl(fid); 
    if line == -1 
     break; 
    end 
    A = sscanf(line,formatSpec); 
    ... 
end 

然後,你可以做任何你需要的與A

例如看看下面的例子:

line = '1 2.5 3.6 abc'; 
A = sscanf(line,'%d %f %f %s') 

A = 
    1.0000 
    2.5000 
    3.6000 
    97.0000 
    98.0000 
    99.0000 

字符串將A(4:end)。如果isempty(A(4:end))這個字符串是空的,那麼您可以隨心所欲地存儲數據,例如,在一個小區裏。

0

假設您不需要可選列,爲什麼不用%* s忽略行的其餘部分並將分隔符設置爲換行符?

+0

這不是一個安全的假設,因爲「可選」並不意味着「不相關」。如果它存在的話,它可能非常重要。 –

相關問題