当我的客户将他们的输入提供给Excel文件时,他们需要列标题。但是当他们将文件导出为CSV(.csv)时,它会将列标题包含在其中。那是问题。
+---------+--------+-------------+ | Post id | Name | Designation | +---------+--------+-------------+ 101 noYon designer 102 nakib accountant 103 nishi developer +---------+--------+-------------+
在我的CSV(以逗号分隔)中,我得到了:
Post id,Name,Designation 101,noYon,designer 102,nakib,accountant 103,nishi,developer
我需要在使用PHP将其上传到MySQL时从CSV中排除列标题(第一行)。
有什么办法吗?
答案 0 :(得分:1)
在 This article 和 This forum thread 的帮助下,在我的同事Tahmina Aktar女士的亲身帮助下,我找到了一个可行的解决方案西。希望它会帮助任何人尝试这样的事情:
//get the csv file
$file = $_FILES[csv][tmp_name];
$handle = fopen($file,"r"); // read the file
?>
<?php
// make the loop and do upload
$find_header = 0; // a simple counter
while( $data = fgetcsv( $handle,6000,",","'") ) {
$find_header++; //update counter
if( $find_header > 1 ) {
$sql = mysql_query( "INSERT INTO table_name (
post_id,
name,
designation
)
VALUES
(
'".$data[0] ."',
'".$data[1] ."'
'".$data[2]."'
)
");
}
} // endwhile
逻辑很简单,有点幼稚。如果我们知道fgetcsv()
的工作原理。 fgetcsv()
是:
fgetcsv()
函数从打开的文件中解析一行,检查CSV字段。
fgetcsv()
函数停止在新行,指定长度或EOF(以先到者为准)返回。
这意味着每次循环播放时它都会获取CSV的每一行。因此,如果我们传递一个简单的PHP计数器并排除第一行,那就很简单了。
当然,不要忘记使用PHP清理函数(例如trim()
或addslashes()
等)来清理数据。)
您可以获取我的一大堆代码 HERE 。
答案 1 :(得分:1)
一个简单的解决方案:读取第一行并丢弃它,然后在循环中逐行读取文件的其余部分:
//get the csv file
$file = $_FILES[csv][tmp_name];
$handle = fopen($file,"r");
fgetcsv($handle); // Discard first line. If we know the maximum line length
// add it as second argument: it's slightly faster
while( $data = fgetcsv( $handle) ) {
$query = mysqli->query( "INSERT INTO table (post_id,name,designation) VALUES ('".
implode($data,"','")."'";
}
我在此处未编写的更快的解决方案:将多组值附加到INSERT
,如下所示:
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
答案 2 :(得分:0)
$filename = $_FILES["file"]["tmp_name"];
if ($_FILES["file"]["size"] > 0){
$file = fopen($filename, "r");
fgetcsv($file);
while (($getData = fgetcsv($file, 10000, ",")) !== false){
echo "<pre>";
print_r($getData);
echo "</pre>";
}
fclose($file);
}