PHP 导入 csv 时获得准确的记录计数

PHP Get accurate record count when importing csv

提问人:crosenblum 提问时间:10/5/2021 更新时间:10/5/2021 访问量:38

问:

我有一个函数,在我的类中处理 3 条数据。

  1. 要解析的文件名
  2. 替换字符串,这基本上是插入或替换文本,但值除外。
  3. 用于保存数据或删除以获取新数据的 TableName。

我主要关心的是,我可以通过此功能获得新记录/调整记录的准确计数

下面是此函数的代码。


    /**
 * @return int|string
 *
 * @psalm-return 0|positive-int|string
 */
private function csvimport(string $filename,string $replace, string $tablename) {

    // verify file exists
    if (!file_exists($filename)) {

        // return error message
        return 'File not found at '.$filename;
        
    }
    
    // set counter
    $counter = 0;
    $headcount = 0;

    // now read file line by line skipping line 1
    $file = fopen($filename, 'r');

    while (($line = fgetcsv($file)) !== FALSE) {

        // check if counter is greater than zero
        if ($counter > 0) {
            
            // get number of columns in this line
            $colcount = count($line);

            // replace inside array?
            $line = str_replace('"','',$line);
            
            // convert array to comma-delimmited
            $values = '"'.implode('","', $line).'"';
            
            // compare colcount to headcount
            while ($colcount < $headcount) {

                // add comma to the end of values
                $values .= ',';
                
                // get new colcount
                $colcount = count($values);
                
            }
            
            

            // create sql string
            $sql = $replace.$values.',"","","","")';

            // send this to do an update
            $res = array();
            $res = $this->sql_update($sql);
            
            // get num rows and status
            $status = $res[0];
            $num_rows = $res[1];
            
            // assemble status string
            $status = $status . ' [# Of Rows '.$num_rows.']';

            // do sql tracker
            $this->sqltracker($sql);
            $this->sqltracker($status);

            
        } else {
            
            // count number of columns in header
            $headcount = count($line);
        }
        
        // increment counter
        $counter++;
        
        // reset colcount
        $colcount = 0;
    }

    // close file
    fclose($file);
    
    // return
    return $counter;
    
    
}
PHP 函数 fgetcsv

评论


答:

0赞 M3Ali 10/5/2021 #1

问题是你把数组处理成字符串,把字符串处理成数组。 在这里,您将数组作为字符串进行处理:

$line = str_replace('"','',$line);
    

我认为这应该是:

foreach($line as &$clm){
    $clm=str_replace('"','',$clm);
}
    

在这里,您将字符串作为数组进行处理:

$colcount = count($values);
    

将其更改为:

$colcount++;

由于您没有展示sql_update函数的实现,因此我们无法预料您编写如下代码的原因: $sql = $replace.$values.',“”,“”,“”,“”)';

评论

0赞 crosenblum 10/5/2021
主要问题是 $counter++;这就是我为获取 csv 中解析的行数所做的,但它始终处于关闭状态。每天我都会生成新的 csv,但代码没有显示正在更新/插入的数据。