2017-03-15 113 views
0

我有一個固定寬度的文件格式(原始輸入用於Fortran例程)。該文件中的幾行大致如下:Octave/Matlab - 讀取固定寬度文件

1078.0711005.481 932.978 861.159 788.103 716.076 

如何這其實應改爲:

1078.071 1005.481 932.978 861.159 788.103 716.076 

我已經嘗試了各種方法,textscan,fgetl,的fscanf等,但我的問題是,如上所述,有時由於原始文件的固定寬度,在一些數字之間沒有空白。我似乎找不到直接閱讀它們的方法,我不能更改原始格式。

我已經想出了迄今是使用fgetl其中讀取整個行中的最好的,那麼我重塑結果爲8,6陣列

A=fgetl 
A=reshape(A,8,6) 

產生以下結果

11 
009877 
703681 
852186 
...... 
049110 
787507 
118936 

所以現在我有上述和以爲我可能能夠在該陣列的行串聯在一起以形成每個數字,儘管這是似乎難以以及嘗試過的strcat,vertcat等

所有這一切似乎都很漫長,所以希望得到一些更好的建議。

謝謝。

+0

如果列間距相同,即使它們被壓扁在一起,也可以對str2double(A(1:8))和str2double(A(9:16))執行等等操作的線。只要列長度不變,這可能會有所幫助。我現在沒有MATLAB訪問權限或時間來完成答案 – fyrepenguin

回答

1

如果你能依靠三個小數號碼,你可以使用一個簡單的正則表達式生成缺少的空白:

s = '1078.0711005.481 932.978 861.159 788.103 716.076'; 
s = regexprep(s, '(\.\d\d\d)', '$1 '); 
c = textscan(s, '%f'); 

現在c{1}包含你的號碼。如果s實際上是整個文件而不是一行,這也會起作用。

+0

謝謝,上述答案都有幫助,我將接受這個作爲與我正在使用的非常類似的東西,我沒有想過使用regexprep 。 – user2551578

0

你還沒有提到你需要哪種類型的輸出,但我想你需要從文件中讀取雙精度來做一些計算。我假設你已經能夠讀取你的文件,因爲你已經有reshape()函數的結果。但是,使用reshape()函數對於您的案例不會有效,因爲您的變量不是固定大小的(即1078.071和932.978)。

如果餘did't誤解你的問題:

  1. 你的數據在某些部分壓扁(即1078.0711005.481代替 的1078.071 1005.481)。

  2. 變量的小數部分有3位數字。

首先,我們需要從字符串數組擺脫空間:

A = A(~ismember(A,' ')); 

然後利用這些信息是小數部分有3個數字:

iter = length(strfind(A, '.')); 
for k=1:iter 
    [stat,ind] = ismember('.', A); 
    B(k)=str2double(A(1:ind+3)); 
    A = A(ind+4:end); 
end 

B會作爲結果的雙打數組。