养浩然之气,活着不是为技术,请关心身边的人.

一个操纵CSV文件的类

上一篇 / 下一篇  2007-10-09 14:43:45 / 个人分类:php

<?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);
?>

TAG: PHP php

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

数据统计

  • 访问量: 21808
  • 日志数: 146
  • 建立时间: 2007-08-01
  • 更新时间: 2008-02-20

RSS订阅

Open Toolbar