Re: [請益] 讀檔取出資料(砍除文字檔標記)

看板PHP作者 (你今天開好恨了嗎)時間18年前 (2007/09/24 08:35), 編輯推噓0(001)
留言1則, 1人參與, 最新討論串11/11 (看更多)
~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
文章代碼(AID): #16zmPOlm (PHP)
討論串 (同標題文章)
文章代碼(AID): #16zmPOlm (PHP)