我想跳过csv文件的第一行,以便使用标头。 使用while循环,如何使其跳过第一行?谢谢各位高手。
/usr/bin
答案 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
}
}