<?php
/*************************************************
程序功能:提供简单的CSV操纵功能,已实现功能如下
添加记录:append(array(除编号外的记录字段))
删除记录:delete(记录所在行号(用find()查找));
辅助函数:find(字段编号,查找的字符串)
例如:查找第一个字段且字符串为5的行号,find(0,"5")
查找第二个字段且字符串为“RSS是什么?”的行号,find(1,"RSS是什么?")
getField()获取字段名称,返回数组
rows()返回记录总数
使用:$csv = new CSV;
$csv->file = "你的csv文件";
$csv->num = "你的csv文件统计文件";
$csv->spot = "分隔符";
//CSV Class Begin
class CSV
{
var $fp = "";
var $file = "Artical_List.txt"; //记录CSV文件
var $num = "Artical_Num.txt"; //记录统计文件
var $spot = "";
/*函数:open(integer)
返回:$fp
功能:返回文件指针
参数:(0,1,2),[0对应"r"][1对应"w"][2对应"a"][3对应"r+"]
使用:open(0),open(1),open(2)
*/
function open($mode)
{
switch($mode)
{
case 0:$way="r";break;
case 1:$way="w";break;
case 2:$way="a";break;
case 3:$way="r+";break;
default:exit("打开模式错误!");break;
}
$fp = fopen($this->file,$way);
if(!$fp)
{
exit("打开数据源失败!");
}
$this->fp = $fp;
}
/*函数:getField()
返回:Array
功能:取得CSV文件的字段名称
使用:count(Array)取得字段数目,Array[0],Array[1],...,Array[n]取得各字段名称
*/
function getField()
{
$this->open(3);
rewind($this->fp);
$field = fgetcsv($this->fp,1000,$this->spot);
if(!$field)
{
exit("获取CSV字段名称失败!");
}
$field_num = count($field);
if($field_num==0||$field==null)
{
exit("字段为空!");
}
//list($bianhao,$biaoti,$laiyuan,$shijian,$leibie,$fangci) = $field;
//echo "$bianhao,$biaoti,$laiyuan,$shijian,$leibie,$fangci";
return $field;
}
/*函数:getRecord()
返回:Array||0 ,0表示到达文件尾
功能:取得CSV文件的一行字段数据
使用:count(Array)取得字段数目,Array[0],Array[1],...,Array[n]取得各字段数据
*/
function getRecord()
{
if(!$this->fp)
{
$this->fp = $this->open(0);
}
$record = fgetcsv($this->fp,1000,$this->spot);
$record_num = count($record);
return $record;
}
/*函数:rows()
返回:integer
功能:返回CSV数据记录条数
使用:rows(), 可用于分页
*/
function rows()
{
$file = file($this->file);
$rows = count($file)-1;
return $rows;
}
/*函数:append()
返回:空
功能:添加一条CSV数据记录
使用:append();
*/
function append($arr)
{
if((count($arr)+1)!=count($this->getField()))
{
exit("字段数目错误!");
}
if(!$this->fp){$this->close();}
$fp=fopen($this->num,"r+");
$id=fgets($fp,1000);
$id++;
rewind($fp);
fputs($fp,$id);
fclose($fp);
$this->open(2);
fputs($this->fp,"\r\n");
fputs($this->fp,$id.$this->spot.join($this->spot,$arr));
}
/*函数:delete($id)
功能:删除一个记录
参数:$id记录号,find()函数返回
使用:delete($id)
*/
function find($field,$str)
{
$fp=fopen($this->file,"r");
$k = 0;
while($arrLine=fgetcsv($fp,1000,$this->spot))
{
$k++;
$total=count($arrLine);
for($i=1;$i<=$total;$i++)
{
if($arrLine[$field]==$str)
{
return $k;
}
}
}
}
function delete($id)
{
$temp=array();
$file = file($this->file);
$total = count($file);
$k=0;
for($i=1;$i<$total;$i++)
{
if(($i+1)==$id)
{
continue;
}
$temp[$k]=$file[$i];
$k++;
}
if($this->fp){fclose($this->fp);}
$fp=fopen($this->file,"w");
fputs($fp,$file[0]);
fputs($fp,join($temp));
fclose($fp);
$fp2=fopen($this->num,"r+");
$num=fgets($fp2,1000);
$num--;
rewind($fp2);
fputs($fp2,$num);
fclose($fp2);
}
/*函数:close($fp)
功能:关闭文件指针
参数:$fp一个文件指针
使用:close()
*/
function close()
{
@fclose($this->fp);
}
}
//CSV Class End
//使用示例
$csv = new CSV;
$csv->file = "Artical_List.txt";
$csv->num = "Artical_Num.txt";
$csv->spot = "|";
$csv->open(0);
#添加一条CSV记录
//$csv->append(array('如何在一个html中调用几个
xml文件?','51js.com','2005-12-15 11:50:38','html','0'));
#查找记录
$id=$csv->find(0,"17");
//echo $id;
#删除记录
$csv->delete($id); //删除第$id行记录
#数据记录总数
$rows = $csv->rows();
echo "有数据记录:".$rows."<br/>";
#输出CSV字段名称
echo "<table border=1>\n";
echo "<tr>\n";
$field = $csv->getField();
for($i=0;$i<=count($field)-1;$i++)
{
echo "<th>".$field[$i]."</th>";
}
echo "</tr>\n";
#输出所有的CSV字段数据
while($record = $csv->getRecord())
{
echo "<tr>";
for($i=0;$i<=count($record)-1;$i++)
{
echo "<td>".$record[$i]."</td>";
}
echo "</tr>\n";
}
echo "</table>\n";
$csv->close();
unset($csv);
?>