【问题标题】:PHP dynamically create CSV: Skip the first line of a CSV filePHP动态创建CSV:跳过CSV文件的第一行
【发布时间】:2012-06-09 16:41:24
【问题描述】:

我正在尝试导入 CSV 文件。由于我们使用的程序,第一行基本上是我想跳过的所有标题,因为我已经通过 HTML 放入了自己的标题。如何让代码跳过 CSV 的第一行? (strpos命令就是把所有行的第一个字段截掉。)

<?php
$row = 1;
if (($handle = fopen("ptt.csv", "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
    $num = count($data);
           $row++;
    for ($c=0; $c < $num; $c++) {
    if(strpos($data[$c], 'Finished') !== false) {
    $c++;
echo "<TR> <TD nowrap>" . $data[$c] . "</ TD>"; }
    Else{
        echo "<TD nowrap>" .  $data[$c] . "</ TD>";
        }
    }
}
fclose($handle);
}
?>

【问题讨论】:

    标签: php html csv fgetcsv


    【解决方案1】:

    与其使用 if 条件来检查它是否是第一行,更好的解决方案是在 while 循环开始的那一行之前添加一行额外的代码,如下所示:

    ....
    .....
    fgetcsv($handle);//Adding this line will skip the reading of th first line from the csv file and the reading process will begin from the second line onwards
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
    .......
    .......
    

    就这么简单......

    【讨论】:

    • @dkar , fgetcsv 解析第一行( header )并返回包含这些列的数组。隐式地,文件指针现在位于第 2 行。
    • 这个答案对我有帮助。我的代码是使用第 0 行或第 5 行或第 6 行的标题创建的。它是动态的。使用这种方法,每当我需要找到所需的标头时,我都会动态地迭代文件一段时间。谢谢。
    【解决方案2】:

    由于您一直在跟踪行号,您可以使用continue 跳过第一行的其余循环。

    例如,在您的 while 循环开始处添加这个(就在 $num = count($data) 上方):

    if($row == 1){ $row++; continue; }
    

    还有其他方法可以做到这一点,但请确保当您继续时,$row 仍在递增,否则您将进入无限循环!

    【讨论】:

      【解决方案3】:

      把它放在你的while循环中:

      if ($row == 1) continue;

      【讨论】:

        【解决方案4】:

        请使用以下代码行

        $flag = true;
        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        if($flag) { $flag = false; continue; }
        //your code for insert
        }
        

        将 flag 变量设置为 true 并将其设置为 false 将跳过 CSV 文件的第一行。这很简单,也很容易实现。

        【讨论】:

          【解决方案5】:

          while循环体中添加这个$row++;

          if ($row == 1) {
              continue;
          }
          

          【讨论】:

            【解决方案6】:
            $count = 0;
            while (($fields = fgetcsv($handle, 0, ",")) !== FALSE) {
                $count++;
                if ($count == 1) { continue; }
            

            【讨论】:

              【解决方案7】:

              这对我有用:

              $count = 0;
              
              while(! feof($file))
              
                    {
              
                        $entry = fgetcsv($file, 0, ';');
              
                        if ($count > 0) {
                        //skip first line, header
              
              
                        }
              
                    $count++;
              }
              

              【讨论】:

                【解决方案8】:

                使用此代码

                // mysql hostname
                $hostname = 'localhost';
                // mysql username
                $username = 'root';
                // mysql password
                $password = '';
                
                if (isset($_FILES['file']))
                {   
                
                // get the csv file and open it up
                $file = $_FILES['file']['tmp_name'];
                //$handle is a valid file pointer to a file successfully opened by fopen(), popen(), or fsockopen(). 
                $handle = fopen($file, "r"); 
                    try { 
                    // Database Connection using PDO
                    $dbh = new PDO("mysql:host=$hostname;dbname=clasdb", $username, $password);
                    // prepare for insertion
                    $STM = $dbh->prepare('INSERT INTO statstrackertemp (ServerName, HiMemUti, AvgMemUti, HiCpuUti, AvgCpuUti, HiIOPerSec, AvgIOPerSec, HiDiskUsage, AvgDsikUsage) VALUES (?, ?, ?, ?, ?,?, ?, ?, ? )');
                
                
                
                        if ($handle !== FALSE) 
                        {
                            // fgets() Gets a line from file pointer and read the first line from $handle and ignore it.   
                            fgets($handle);
                            // created loop here
                            while (($data = fgetcsv($handle, 1000, ',')) !== FALSE)
                            {
                            $STM->execute($data);
                            }       
                
                            fclose($handle);
                
                        }
                
                    } 
                    catch(PDOException $e)
                    {
                    die($e->getMessage());
                    }
                
                echo 'Data imported'; 
                
                }
                else 
                {
                echo 'Could not import Data';
                }
                
                ?>
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-09-18
                  • 1970-01-01
                  • 2021-11-11
                  • 2018-06-12
                  • 2014-04-12
                  • 2020-12-15
                  • 2014-07-16
                  相关资源
                  最近更新 更多