2013-07-23 31 views
1

我需要從txt文件導入變量。這個文件有3個主要部分。在Matlab中導入不同的行格式的txt

A)初始標題,含有在每列

如下面的一般信息

B)標題變量,在每列

C)的數值數據:

Headlines - Headlines - Headlines - Headlines 
Headlines - Headlines - Headlines - Headlines 


# A  |  B    C  |  D  | 
# ----------+----------------------------+---------------| 
# 1  | 0.0000E+00 + 0.0000E+00 | 0.0000  | 
# 2/3 | 0.0000E+00 +/- 0.0000E+00 | 0.0000  | 
# 4/5 | 0.0000E+00 +/- 0.0000E+00 | 0.0000  | 
# 6  | 0.0000E+00 + 0.0000E+00 | 0.0000  | 

問題是每次都會改變最初的標題,所以我們不能首先聲明特定的行數來避免。

正如你所看到的,我們有2種不同的行格式。所以我們不能爲每一行寫一個特定的格式,而且每一列中的數字數據的數量也在變化。

我不能做到這一點(數據= textscan(FID, '%S%F%S%F%S%F%S%F', '標題',4)

我只有兩種不同類型的行格式的

我怎麼能只導入數值數據每一行中。

請幫助

回答

0

我最喜歡的方法是在整個文件與該神奇命令讀取:

BUF = textread(文件名, '%s' 的, '定界符', '\ n');

然後解析它。在這種情況下,通過查找初始#來檢測數據線似乎很容易。

+0

這很棒。我使用這個命令,並通過寫aj(1,1)我提取行數然後我使用: Data = textscan(fid,'%s%f%s%f%s%f% s%f','headlines',j),我正在加載我的變量。 非常感謝 – Evans1985

0

您可以通過線,而不是將文件作爲一個整體應用textscan線。例如,基於你給的例子(並假設你已經寫了一個函數來確定數據從頂部線墊):

fileID = fopen(fileName); 
blockLine = 0; 
while ~feof(fileID) 
    currLine = fgetl(fileID); 
    % Check if we've reached the datablock 
    if strcmpi(currLine(1),'#') 
     blockLine = blockLine + 1; 
    end 
    % Use first line of datablock to determine textscan format 
    if blockLine == 1 
     textFormat = [insert format determination function]; 
    elseif blockLine > 2 
     % Ignoring second line (dashes only) 
     lineData = textscan(currLine,textFormat); 
     [insert code to distribute data to larger variables] 
    end 
end 
fclose(fileID); 
+0

Dear Skipsh非常感謝您的回答。這非常有幫助 – Evans1985