【问题标题】:Skip lines with fgetcsv使用 fgetcsv 跳过行
【发布时间】:2014-01-27 14:38:37
【问题描述】:
 public function loadCSV()
 {

                $file  = fopen($this->path, 'r');
                $dbcnt = $this->getdbrows();


                while(!feof($file))
                {

                        if(fgetcsv($file)[$this->group] == '610')
                        {

                                $date   = fgetcsv($file)[$this->datePos];
                                $num    = $this->formatNum(fgetcsv($file)[$this->numPos]);
                                $rec    = fgetcsv($file)[$this->recPos];

                                if(!(in_array($num, $this->filter)))
                                {

                                        array_push($this->csvitem, $date . ';' . $num . ';' . $rec);

                                }
                        }

                }

        $this->writeCSV();

        }

所以我使用fopen 加载了一个csv 文件,然后我逐行浏览它并将日期、num 和rec 保存到它们的变量中。但是,由于我一遍又一遍地阅读同一个文件。我不想一遍又一遍地存储旧数据。因此,我得到了 $dbcnt 的 db 行数,然后我希望从该行开始。

你有什么想法吗?

【问题讨论】:

标签: php row fgetcsv


【解决方案1】:

我会使用SplFileObject。它非常快,并且支持一个不错的基于行的搜索功能:

public function loadCSV() {
    $file = new SplFileObject($this->path);
    $dbcnt = $this->getdbrows();
    $file->seek($dbcnt); // <---- here

    while (!$file->eof()) {
        $record = $file->fgetcsv();
        if ($record[$this->group] == '610') {
        .. and so on..

【讨论】:

    【解决方案2】:

    @ex3v 的这个链接确实帮助了我 How do I open a file from line X to line Y in PHP?

    我需要的只是 $dbcnt 的一个 if 语句

    if($dbcnt >= $line)
    {
    
    }
    

    其中$line 是 fgetcsv 的每个错误的计数器

    【讨论】:

    • 无论如何,您正在阅读整个文件。您不是“从该行开始”,而是在阅读所有内容之后从该行继续。结果:你一无所获。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 2015-08-27
    • 1970-01-01
    • 2021-12-02
    • 2012-06-01
    相关资源
    最近更新 更多