2012-01-20 100 views
0

这些代码将CSV文件的内容导入数据库。PHP - 导入到MySQL数据库时跳过csv的第一行

$databasehost = "localhost"; 
$databasename = "test"; 
$databasetable = "sample"; 
$databaseusername ="test"; 
$databasepassword = ""; 
$fieldseparator = ","; 
$lineseparator = "\n"; 
$csvfile = "filename.csv"; 
$addauto = 0; 
$save = 1; 
$outputfile = "output.sql"; 

if(!file_exists($csvfile)) { 
    echo "File not found. Make sure you specified the correct path.\n"; 
    exit; 
} 

$file = fopen($csvfile,"r"); 

if(!$file) { 
    echo "Error opening data file.\n"; 
    exit; 
} 

$size = filesize($csvfile); 

if(!$size) { 
    echo "File is empty.\n"; 
    exit; 
} 

$csvcontent = fread($file,$size); 

fclose($file); 

$con = @mysql_connect($databasehost,$databaseusername,$databasepassword) or die(mysql_error()); 
@mysql_select_db($databasename) or die(mysql_error()); 

$lines = 0; 
$queries = ""; 
$linearray = array(); 

foreach(split($lineseparator,$csvcontent) as $line) { 

    $lines++; 

    $line = trim($line," \t"); 

    $line = str_replace("\r","",$line); 

    $line = str_replace("'","\'",$line); 

    $linearray = explode($fieldseparator,$line); 

    $linemysql = implode("','",$linearray); 

    if($addauto) 
     $query = "insert into $databasetable values('','$linemysql');"; 
    else 
     $query = "insert into $databasetable values('$linemysql');"; 

    $queries .= $query . "\n"; 

    @mysql_query($query); 
} 

@mysql_close($con); 

if($save) { 

    if(!is_writable($outputfile)) { 
     echo "File is not writable, check permissions.\n"; 
    } 
    else { 
     $file2 = fopen($outputfile,"w"); 

     if(!$file2) { 
      echo "Error writing to the output file.\n"; 
     } 
     else { 
      fwrite($file2,$queries); 
      fclose($file2); 
     } 
    } 

} 

echo "Found a total of $lines records in this csv file.\n"; 

这是如何工作的。
管理员将收到一个excel电子表格(.xls)文件并将其保存为.csv文件。并且该文件的第一行将是Excel电子表格的“标题”。
示例:姓名,电子邮件,联系电话,国家,地址标题。

因此,在将CSV文件的内容导入到数据库之前,我想要跳过第一行。这意味着导入内容将从CSV文件的第二行开始。

我可以知道应该编辑哪部分代码,应该编辑哪些内容?
对不起,因为我是编程PHP的新手。

在此先感谢!

+0

*请*停止编写新的代码时使用的功能过时的'mysql_'家庭。看看[mysqli](http://php.net/mysqli)或[PDO](http://php.net/PDO)。另外,请谨慎使用'@'错误沉默操作符。它可能会隐藏你的代码中的错误。 – Charles

+0

你可能会数到一个。你知道,这并不难。 –

回答

4

工作会有一点变化。在您的foreach回路split您的$csvcontent和安全的结果阵列$allLines。然后使用array_shift删除这个数组(函数也返回这个元素,但在这里我们不需要它)的第1个要素:

$allLines = split($lineseparator,$csvcontent); 
array_shift($allLines); // removes the 1st element 

foreach($allLines as $line) { 
    [...] 
+0

+1,很好的解决方案,但你可以良心良好的缩短(使用原始代码):'foreach(array_shift(split($ lineseparator,$ csvcontent))作为$ line){' – zrvan

+4

@zrvan:你的建议将会不工作,因为'array_shift'返回第一个元素,而不是缩短的数组。 – DerVO

+0

糟糕!我不好,你说得对! – zrvan

3

您已经在各行中环工作。刚刚跳过第一次迭代:

$lines = 0; 

foreach(split($lineseparator,$csvcontent) as $line) { 
    $lines++; 

    if($lines > 1){ 
     $line = trim($line," \t"); 
     $line = str_replace("\r","",$line); 
     $line = str_replace("'","\'",$line); 

     $linearray = explode($fieldseparator,$line); 

     $linemysql = implode("','",$linearray); 

     if($addauto) 
      $query = "insert into $databasetable values('','$linemysql');"; 
     else 
      $query = "insert into $databasetable values('$linemysql');"; 

     $queries .= $query . "\n"; 

     @mysql_query($query); 
    } 
} 
+0

我发现一个小问题; 'if($ lines> 0){'将以当前的形式,* always *评估为'true'。 – zrvan

+1

你是对的。我把它改成了'if($ lines> 1){',因为第一行变量会增加一次。谢谢。 – Leonard

+0

嗯我在同一时间编辑,但我移动了行++;在if语句之后。 –

1

使用本

$line_array = explode($csvcontent,$lineseparator); 
$total_line = count($line_array); 
for ($i=1;$i<$total_line;$i++){ 
    echo $line_array[$i] //it is your line play with this 
}