限制处理的CSV行数

时间:2020-09-26 06:56:03

标签: php

我有一个处理CSV并输出另一个CSV的小脚本。

我想包括一个可选的限制器,以在所需的限制器处停止处理CSV。

我尝试了do while和这个for loop都没有用。

csv始终是每一行,而不是csv限制值?

  public function get_csv($csv_limit)
  {
    $file = fopen($this->csv_url, "r");
    $rows = [];
    $idsColumnsWanted = array_flip(array_keys($this->csv_headers));
    $skip_header = 0;
    
    for ($i = 0; $i <= $csv_limit; $i++)
    {
      while (false !== $fields = fgetcsv($file)) {
        if ($skip_header == 0) {
          $skip_header++;
          continue;
        }
        $this->csv_rows[] = array_intersect_key($fields, $idsColumnsWanted);
      }
    }

    fclose($file);
  }

这也是我的make csv方法。

  public function make_csv()
  {
    $csv_file_name = $this->csv_file_name . "_" . date("Y-m-d_H-i-s",time()) . ".csv";
    $csv_init = fopen($csv_file_name, "w");
    
    fputcsv($csv_init, $this->csv_headers, ",", '"');
    
    foreach ($this->csv_rows as $row) {
      fputcsv($csv_init, $row);
    }
    
    fclose($csv_init);
}

2 个答案:

答案 0 :(得分:1)

然后在for循环中继续使用while循环读取所有行...

for ($i = 0; $i <= $csv_limit; $i++)
{
  while (false !== $fields = fgetcsv($file)) {  // This reads the entire file
  }
}

相反,您可以只使用while循环,但要计算输出的行数...

$rowCount=0;
while ((false !== $fields = fgetcsv($file)) && $csv_limit > $rowCount++) {
    if ($skip_header == 0) {
        $skip_header++;
        continue;
    }
    $this->csv_rows[] = array_intersect_key($fields, $idsColumnsWanted);
}

答案 1 :(得分:1)

  public function get_csv($csv_limit)
  {
    $file = fopen($this->csv_url, "r");
    $rows = [];
    $idsColumnsWanted = array_flip(array_keys($this->csv_headers));
    
    for ($i = 0; $i <= $csv_limit; $i++)
    {
      $fields = fgetcsv($file);
      if ($fields === false) break;
      if ($i === 0) continue;
      $this->csv_rows[] = array_intersect_key($fields, $idsColumnsWanted);

    }

    fclose($file);
  }