Re: [請益] 讀檔取出資料(砍除文字檔標記)
~x0 PTT實業坊
FROM:ta009
STATUS REPORT
製表日期:07/09/17 15:18:09 頁次:1
==============================================================================
MODEL NO. DECRIPTION DEPART M.O NO. DATE
-------------------- --------------- ----------- ---------- --------
100-2164-32C ASSY PWB HIGAIN 4438 W02-790185 07/09/13
100-2223-01BR6 PWB ASSY,HRU-40 4438 W02-790217 07/09/14
==============================================================================
(csfr069) (接下頁)~i
以上是報表內容
以下是我的寫法
$day_list = fopen('schedule.txt','r');
$buf=fread($day_list,filesize('schedule.txt'));
fclose($day_list);
$theData = explode("\n", $buf ); //先用段行做為切割標準,切出每一行資料
$i=filesize('schedule.txt');
$k=0;
/*以下是取出報表中的資料
以" "為切割點取每行頭一筆資料
因為頭尾行數是固定,所以只要陣列中第一行為"~x0"
就直接往下跳8行到資料行裡*/
for($j=0;$j<=$i;$j++){
$txt = split(" ", $theData[$j]);
if( $txt[0]=="~x0"){
$j=$j+8;
}
else if($txt[0] == "(csfr069)"){
$j=$j+8;
$k=$k-1;} //這裡是因為我之前切不出來"=="
//但是因為資料行固定的原因,所以只要頭檔是"(csfr069)"
//就把上一行資料丟棄
else{
$beta[$k]=$theData[$j];
$k++;}
}
//取出來就只剩表報中的資料行,並存在陣列$beta中
$print = split(" ",$beta[0]);//就是這邊卡很久
//因為不知道沒有固定長的空格該如何切
//感謝gpmm跟dinos兄的方法,我會試看看的
$z=0;
foreach ($print as $value) {
$z++;
echo "第$z 筆資料為:";
echo "$value <br>";
}
//印出切完的資料
※ 引述《dinos (守護神)》之銘言:
: function checkNote($fn){
: if(!file_exists($n))return false;
: $returnData=array();
: $fr=@fopen($fn,"r");
: if(!$fr)return false;
: while(($line=fgets($fr))!=false){
: $line=trime($line,"\r\n");
: /*** 略掉完全沒有中文字及空白的行 ***/
: if(preg_match('/^[0x00-0x8f]*$/',$line))continue;
: /*** 略掉空白(\t\r\n\ )開頭的行 ***/
: else if(preg_match('/^\s+/',$line))continue;
: /*** 略掉長度不足的行 ***/
: else if(strlen($line)<6)continue;
: /*** 如果要切割字串再處理這一段 ***/
: /***
: $line=preg_split('/[\s]{2,}/',$line);
: ***/
: $returnData[]=$line;
: }
: fclose($fr);
: return $returnData;
: }
: ※ 引述《gpmm (銀色)》之銘言:
: : [蘇珊]
: : 寫了一下,不確定你的需求,所以應該不完全合用
: : function analysisText ($file) {
: : if (file_exists ($file)) {
: : $fp = fopen ($file, "r");
: : $result = array ();
: : while (!feof ($fp)) {
: : $buffer = fgets ($fp, 4096);
: : /*
: : //資料行判定
: : $preg = "";
: : if (preg_match ($preg, $buffer))
: : continue;
: : */
: : //資料切割方式
: : $preg = "/( ){2,}/";
: : $arr = preg_split ($preg, $buffer);
: : array_push ($result, $arr);
: : }
: : return $result;
: : }
: : }
: : 這樣傳回來的 array 是以每一行為單位,切割過的 array,
: : 如果確定每行的第一組都是說明字串,那麼在使用上把他略過就可以了。
: : 缺點是因為在後面做忽略,大筆檔案會使變數肥大,
: : 好的方式是在資料判定或資料切割方式那邊決定,只是因為不清楚你的需求,
: : 所以暫且這樣寫。
: : 另,資料切割方式是切割超過兩個的空白,換言之,
: : "A B C D EF" 在切割過後是
: : 1 123 12 123 (←此為空白數)
: : Array (
: : [0]=>A B
: : [1]=>C D
: : [2]=>E
: : )
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 203.73.255.34
→
09/24 15:35, , 1F
09/24 15:35, 1F
討論串 (同標題文章)
完整討論串 (本文為第 11 之 11 篇):
PHP 近期熱門文章
PTT數位生活區 即時熱門文章