在PHP中读取CSV文件并验证其第一行是否包含标题和日期

时间:2018-10-01 08:07:06

标签: php fgetcsv

我必须使用php上传一个csv文件。但是在上传之前,我需要先对其进行两件事验证。

  1. ,如果其标题为“标题”和“日期”(只有列)。

  2. 前两行标题不应相同。

这是预期文件的结构。

Title   Date
"The Forest: Season 1: Episode 1",  "7/7/2018"
"Forgive Us Our Debts", "7/7/2018"
"Mr. Sunshine: Season 1: Episode 1",    "7/7/2018"
到目前为止的

代码

$rows   = array_map('str_getcsv', file($_FILES["file"]["tmp_name"]));
    $header = array_shift($rows);
    $csv    = array();
    foreach($rows as $row) {
        $csv[] = array_combine($header, $row);
    }

我在关联数组中有一个csv文件,但无法读取第一行。

如何使用行索引读取CSV行?

3 个答案:

答案 0 :(得分:0)

str_getcsv以逗号作为默认定界符。而且您只能转换一行CSV。如果要转换整个文件,则应使用fgetcsv [https://secure.php.net/manual/en/function.fgetcsv.php]

此代码示例将起作用:

<?php

$csv = "Title\tDate
\"The Forest: Season 1: Episode 1\"\t\"7/7/2018\"
\"Forgive Us Our Debts\",\t\"7/7/2018\"
\"Mr. Sunshine: Season 1: Episode 1\",\t\"7/7/2018\"";

$rows   = array_map(function ($csv){
    return str_getcsv($csv, "\t");
}, explode("\n",$csv));


$header = array_shift($rows);
$result    = array();
foreach($rows as $row) {
   $result[] = array_combine($header,$row);
}

var_dump($result);

答案 1 :(得分:0)

尝试一下

$csv = array_map('str_getcsv', file('data.csv'));
if(isset($csv[0])){    
    if($csv[0][0] != 'Title' || $csv[0][1] != 'Date'){      
        return "Heading(Title and/or Date) is missing.";
    }else{        
        foreach ($csv as $key => $value) {
            //Process further
        }
    }    
}

答案 2 :(得分:0)

您可以执行以下操作:

$file = new SplFileObject("file.csv");
$file->setFlags(SplFileObject::READ_CSV);

$valid = true;
foreach ($file as $i => $row) {

     if ($i > 1) break;

     list($title, $date) = $row;

     if ($i === 0 && ($title !== 'Title' || $date !== 'Date')) {
          $valid = false;  
     } else {
          $second_row = $file[2];

          if ($title === $second_row[0]) {
              $valid = false;
          }
     }
}