2012-01-20 130 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 
}