Re: [問題] txt讀檔如何只讀某幾行已回收
感謝版上各位前輩的熱心指點,小弟的問題終於解決了
感謝 nosql 前輩和 BrianCashman 前輩的指點,讓小弟能學到另一個解決問題的方法
感謝 alenti 前輩熱心來信指點,給了小弟臨門一腳
為了能讓之後的人爬文時能當作參考,我把原先的問題說得清楚些:
我要資料是 SSACC 和 ESACC 這兩列內的資料
SSACC
. \
. \
. \
. 這之中的才是我要的資料
. /
. /
. /
ESACC
而在這兩列中,只取前三行數值,若讀到字串則跳過此列
如:
3601331 520.7 375.8 527.0 ... %取前三行數值
MSG 3601339 -4 TARGET_SHOW %此列跳過不要
3601339 521.0 353.5 528.0 ...
資料的列數不定,但讀到 ESACC 時,表示此筆的資料讀取完畢
之後又會有些非資料的列數,跳過不要
當讀到 SSACC 時,下一筆的資料讀取開始,讀到 ESACC 時,此筆資料讀取結束
就這樣一直讀到檔案結束(一個檔案約有數十萬列資料,非常大)
原先遇到的問題是因 fscanf 不能跳著讀,所以只能一列一列地掃文件(因我只取前三行)
但我不知要如何換列(用 fgetl 的話會變成跳著列讀),故前來版上詢問換列指令
後來經 alenti 前輩的來信指點,發現 fscanf 不只能用來掃文件,也能用來掃變數
所以從頭到尾只要用 fgetl 掃文件,再配合 fscanf 和 if 判斷式(遇到字串不要)
就可以達成我要的效果,最後的程式碼如下:
clc;
clear;
fclose all;
format compact;
fid = fopen('e:\test2.txt')
file_end_signal = 0;
index = fgetl(fid);
while isempty(findstr(index,'SSACC'))
index = fgets(fid);
end
yes = 1;
data = [];
temp=[];
while yes
temp = fgets(fid); %讀一列進來
if strfind(temp,'ESACC') %如果讀到ESACC便跳出迴圈
break
elseif isempty(find(isletter(temp),1)) %表示該列只有數字
data_num = sscanf(temp,'%f',[1,3]);
else
data_num = []; %表示該列有文字但非ESACC,該行不要
end
data = [data;data_num]; %把得到的資料合併起來
end
這是一個區塊的讀法,只要再加個迴圈,修改一下便可以讀完整個文件了
再次感謝各位前輩的指點
※ 引述《powerup (東刀輪一流)》之銘言:
: 請教一下版上的各位前輩:
: 小弟的資料格式是由許多重複的區塊組成,單元區塊的組成如下:
: =====================================
: .
: . (非資料列,列數不定)
: .
: .
: SSACC R 3601331
: 3601331 520.7 375.8 527.0 ...
: MSG 3601339 -4 TARGET_SHOW
: 3601339 521.0 353.5 528.0 ...
: 3601341 521.0 345.1 528.0 ...
: MSG 3601343 -9 TARGET_SHOW
: 3601353 519.4 302.7 526.0 ...
: .
: .
: . (以此類推,列數不定)
: .
: .
: .
: ESACC R 3601331 3601359 30
: .
: . (非資料列,列數不定)
: .
: .
: ======================================
: 小弟要取的是SSACC和ESACC這兩列內的資料
: 只有取前三行的數字,文字跳過,亦即只有取3601331 520.7 375.8此種數字而已
: (第四行之後的也不要)
: 目前的寫法是:
: index = fgetl(fid);
: while isempty(findstr(index,'SSACC'))
: index = fgetl(fid);
: end
: yes = 1;
: data = [];
: temp=[];
: while yes
: if strcmp(temp,'ESACC') % 如果讀到ESACC便跳出迴圈
: break
: elseif ischar(temp) %如果讀到字串便捨棄此列
: temp = fgetl(fid);
: end
: temp = fscanf(fid,'%f%f%f',3); %一列只讀三筆資料
: data = [data;temp];
: % 不會直接換列...
: end
: 但是fscanf的指令中,size只能設定總共要讀幾筆資料,並排列成一指定的矩陣格式
: 似乎不能跳著讀
: 所以我就用上述的寫法,打算一列一列讀,但是卻不知道該如何換列
: 請問是用fseek嗎?那參考點要怎麼設呢?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.115.47.45
討論串 (同標題文章)
MATLAB 近期熱門文章
PTT數位生活區 即時熱門文章