Re: [問題] 關於檔案讀取已回收

看板MATLAB作者 (Acoustic)時間16年前 (2009/06/08 21:54), 編輯推噓2(200)
留言2則, 1人參與, 最新討論串2/2 (看更多)
不跳行的寫法 (我不知道怎麼跳行 orz,不過三四百行算小檔,全讀進來無妨) TextFile = textread( FileName, '%s', 'delimiter', '\n', 'whitespace', '' ); Iwant356 = regexp(TextFile{356},'([+-]?\d+\.\d+|[+-]?\d+)$','tokens','once'); Iwant361 = regexp(TextFile{361},'([+-]?\d+\.\d+|[+-]?\d+)$','tokens','once'); Iwant356 = eval(Iwant356{1}); %%% string to double Iwant361 = eval(Iwant361{1}); %%% string to double 我用 regular expression 來抓取數字的部份 [+-]?\d+\.\d+ 會抓取有小數點的數字串,同時含蓋數字前方的正負號 [+-]?\d+ 會抓取沒小數點的數字串,同時含蓋數字前方的正負號 最後的$代表只比對在字串尾巴的數字串。 如果您的字串比較規律,例如冒號":"跟數字中間一定有空白 那麼用 sscanf 寫起來比較容易懂 Iwant356 = sscanf( TextFile{356}, '%*s %*s %*s %f' ); 前面三個 %*s 代表跳過三個字串,也就是 "PSNR", "Y(dB)", ":" 這三個字串 所以 %f 比對到的結果才會回傳到 Iwant356 之中,也就是 34.56。 但這招在第361行無法直接使用,因為冒號":"和150.00連在一起, 若是分開的,那麼就可以用 sscanf 來讀取,也就是用6個%*s和1個%f ※ 引述《Vancloud (悶)》之銘言: : 小弟不才,爬了很多文 : 看到好幾個方法,但我就是不太會用 : 精華區也去查過了,但看到的推文都解答一半 : 我想請教的是 : 今天我有一個檔案有三、四百行 : 我想要的只有其中的兩行 : ex: : ... (前面的三百多行) : PSNR Y(dB) : 34.56 (第三百五十六行) : ... (又跳了幾行) : Bit rate (kbit/s) @ 30.00Hz :150.00 (第三百六十一行) : 如上面的範例,我想要的只有 34.56 跟 150.00 這兩個數字 : 我該怎麼樣讀取? : 我有看到有寫到要跳行的話可以利用fgetl跳行,但又有大大說效率不好 : 可以直接用textread跳行(但這個方法我一直試不出來) : 而利用fgetl跳到我要的行數之後我又試不出只把34.56讀出來的方法 : 希望有高手能夠為我解答 : 問題一:textread怎麼跳到我想讀的那行? : 問題二:如果textread跳到我想要的那行之後,我該怎麼只取出我要的數值? : 問題三:利用fgetl跳到我想要的行數之後,我該怎麼只取出我要的數值? : 謝謝各位高手,一個問題願以200P來回饋,謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.114.27.3

06/08 22:01, , 1F
361行150跟前面的冒號有空一格
06/08 22:01, 1F

06/08 22:12, , 2F
太感謝您了,我已經成功了,謝謝
06/08 22:12, 2F
※ 編輯: banco 來自: 140.114.27.3 (06/08 23:11)
文章代碼(AID): #1ABHWpXo (MATLAB)
討論串 (同標題文章)
文章代碼(AID): #1ABHWpXo (MATLAB)