PHP-导入csv文件时如何跳过第一行?

时间:2018-07-05 02:48:49

标签: php

我想跳过csv文件的第一行,以便使用标头。 使用while循环,如何使其跳过第一行?谢谢各位高手。

/usr/bin

4 个答案:

答案 0 :(得分:0)

只需添加一个“垃圾”电话:

$junk = fgetcsv($handle,2000,",");

在while循环之前。

答案 1 :(得分:0)

我获取了您的代码,并将while()语句的内容包装在if()语句中。

我添加了一个标志(即$ num)来跟踪是否正在处理第一次迭代。 if()检查$ num是否等于0,如果等于,则将其递增。 您的while()代码将不会为该迭代处理。 下一次迭代时,$ num标志将不等于0,并处理while()语句的内容。

<?php
$con = mysqli_connect('localhost','root','') or die (mysql_error());

mysqli_select_db($con, 'test');

if(isset($_POST['submit'])){
    $file = $_FILES['file']['tmp_name'];
    $handle = fopen($file,"r");
    $num = 0;
    while(($fileop = fgetcsv($handle,2000,",")) !==false){
        if($num == 0){
            $num++;
        } 
        else{
            $KeyAccount = $fileop[0];
            $BatchNumber= $fileop[1];
            $Product = $fileop[2];
            $Quantity = $fileop[3];
            $PO = $fileop[4];
            $DateRequested = $fileop[5];
            $DateDelivered = $fileop[6];
            $Status = $fileop[7];
            $Serial = $fileop[8];
            $Voucher = $fileop[9];
            $DateExpiry = $fileop[10];
            $sql = mysqli_query($con, "INSERT INTO orders (KeyAccount,BatchNumber,Product,Quantity,PO,DateRequested,DateDelivered,Status,Serial,Voucher,DateExpiry) VALUES ('$KeyAccount','$BatchNumber','$Product','$Quantity','$PO','$DateRequested','$DateDelivered','$Status','$Serial','$Voucher','$DateExpiry')");
        }
    }
    if($sql){
        echo '<script language="javascript">';
        echo 'alert("Successfully Inserted.")';
        echo '</script>';
    }
    else{
        echo "error";
    }
}

?>

答案 2 :(得分:0)

这里是解析CSV文件的替代解决方案。唯一的问题是CSV数据是简单的逗号分隔值,即:逗号是纯分隔符,而不是列数据的一部分(例如:不能与one,two,"three,four",five一起使用),并且该数据不包含换行符。 / p>

首先,样本数据:

  

header1,header2,header3,header4,header5,header6,header7,header8,header9,header10,header11   KeyAccount1,批次编号1,产品1,数量1,PO1,DateRequested1,DateDelivered1,Status1,Serial1,Voucher1,DateExpiry1   KeyAccount2,批次编号2,产品2,数量2,PO2,DateRequested2,DateDelivered2,Status2,Serial2,Voucher2,DateExpiry2   KeyAccount3,批次编号3,产品3,数量3,PO3,DateRequested3,DateDelivered3,Status3,Serial3,Voucher3,DateExpiry3

接下来,是用于解析CSV文件的相关PHP代码。

<?php

// Start with anything else you need here

$inputfile = '/tmp/data.csv';

// Check to make sure the file exists and is readable
if (file_exists($inputfile) && is_readable($inputfile))
{
  // Read the whole contents of the file into an array instead of using fgetcsv
  $data = file($inputfile);

  // Remove the first line of data, optionally save it into $header
  $header = array_shift ($data);

  // Parse the rest of the data
  foreach ($data as $record)
  {
    // Optional, trim spaces on each sides
    $record = trim($record);

    // Skip empty lines
    if ($record == '') { continue; }

    // Separate the records by comma using explode
    // WARNING: May not give proper result if the record column contains comma character
    list ($KeyAccount, $BatchNumber, $Product, $Quantity,
          $PO, $DateRequested, $DateDelivered, $Status,
          $Serial, $Voucher, $DateExpiry)                 = explode(',', $record);

    echo "Record = $KeyAccount, $BatchNumber, $Product, $Quantity, $PO, $DateRequested, $DateDelivered, $Status, $Serial, $Voucher, $DateExpiry\n";

    // Do anything else you need here
    // $sql = mysqli_query($con, "INSERT INTO orders (KeyAccount,BatchNumber,Product,Quantity,PO,DateRequested,DateDelivered,Status,Serial,Voucher,DateExpiry) VALUES ('$KeyAccount','$BatchNumber','$Product','$Quantity','$PO','$DateRequested','$DateDelivered','$Status','$Serial','$Voucher','$DateExpiry')");
  }
}

抽样结果:

$ php so.php
Record = KeyAccount1, BatchNumber1, Product1, Quantity1, PO1, DateRequested1, DateDelivered1, Status1, Serial1, Voucher1, DateExpiry1
Record = KeyAccount2, BatchNumber2, Product2, Quantity2, PO2, DateRequested2, DateDelivered2, Status2, Serial2, Voucher2, DateExpiry2
Record = KeyAccount3, BatchNumber3, Product3, Quantity3, PO3, DateRequested3, DateDelivered3, Status3, Serial3, Voucher3, DateExpiry3

请注意,如代码注释中所述,我们没有使用fgetcsv()来读取和解析CSV文件。相反,我们使用file()将整个文件读取为数组,然后一个一个地解析它们。

不确定fgetcsv()file()之间的效果如何。但是,我们在其中一个生产服务器中使用了类似的代码,到目前为止,它似乎仍然可以正常工作。

答案 3 :(得分:0)

  

使用此代码段获取CSV数据,并取消设置第一行以删除标题。

$csv_data = array_map('str_getcsv', file($_FILES["file"]["tmp_name"]));
if (!empty($csv_data)) {
    unset($csv_data[0]); // skip the first row i.e the header
    foreach ($csv_data as $csv_row) {
        // do MySQL updation 
    }
}