作者OpenGoodHate (你今天开好恨了吗)
看板PHP
标题Re: [请益] 读档取出资料(砍除文字档标记)
时间Mon Sep 24 08:35:32 2007
~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
1F:→ dinos:这种报表是定长度的 直接取固定长度 09/24 15:35