【问题标题】:Check for header in csv and ignore header in php检查 csv 中的标头并忽略 php 中的标头
【发布时间】:2012-07-27 16:15:59
【问题描述】:

我想检查 csv 文件是否包含标题并忽略标题。

我必须检查第一列是否不是字符

csv 文件格式:avgTemperature, minTemperature, maxTemperature

$f = fopen("./uploads/" .$filename, "r");
$string = "avgTemperature";
if (fgetcsv($f)==$string){  
    // read the first line and ignore it
    fgets($f);
}

【问题讨论】:

  • 那么你的问题是什么?
  • @AleksG...我只是纠结于如何检查 csv 的第一行是否为字符。

标签: php file-upload csv fgetcsv


【解决方案1】:

根据您的评论,以及实际数据是温度(即数字数据)的想法,如果您确实有标题,那么它们将是文本字符串而不是数字。因此,您可以执行以下操作:

$f = fopen("./uploads/" .$filename, "r");

if(!($data = fgetcsv($f))) {
    return;    //most likely empty file
}

if(!is_numeric($data[0])) {
    //this is your header line - skip it - and read the next line
    $data = fgetcsv($f);
}

while($data) {
    //process a line of data
    ...
    //and read the next line
    $data = fgetcsv($f);
}

编辑:最后一个循环的替代版本如下所示:

do {
    //process a line of data
    ...
}
while ($data = fgetcsv($f));

【讨论】:

  • +1 用于替代 while 循环中的逻辑。虽然我建议使用while($data = fgetcsv($f)) 进行精简
  • @JasonMcCreary 是的,可以这样做,但必须是 do-while 循环
  • 不要这么认为,朋友。 while 总是首先评估。 do/while 在第一次迭代后评估,总是先运行。确保您知道其中的区别。
  • @JasonMcCreary 没错,我的朋友。因为您已经阅读了第一行,所以您必须在循环体之后阅读/评估下一行。复制/粘贴我的代码并运行它。
【解决方案2】:

我假设您的完整代码使用循环(whilefor)。

因此,您有几个选择。

  • 直接跳过第一行总是
  • 使用逻辑测试标题行然后跳过。

无论哪种方式,continue 都是关键。

PHP 伪代码:

while (…) {
  if ($row == $header_row) {
    continue;
  }

  // data rows
}

更新

在您的情况下,确定第一行是否为标题行的逻辑似乎是一个更好的解决方案。您可以使用以下内容进行测试。

if ($row[0] == 'avgTemperature') {
  // header row
}

注意:这里假设第一列数据是avgTemperature,它的表头是avgTemperature。根据需要进行调整。

【讨论】:

  • 我不想跳过第一行,就好像 csv 没有标题一样,它会跳过我的数据的第一行。我是 php 新手,所以我真的不知道如何检查 csv 的第一列是字符还是浮点数?
  • 我认为OP的问题是弄清楚第一行是标题行还是第一行数据;而不是如何查看数据。
猜你喜欢
  • 2015-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-08
  • 2011-09-23
  • 1970-01-01
  • 2012-01-03
相关资源
最近更新 更多