2012-01-20 3 views
0

Эти коды импортируют содержимое файла CSV в базу данных.PHP - Пропустить первую строку csv при импорте в базу данных MySQL

$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

Небольшое изменение будет работать. Перед вашей петлей foreachsplit ваш $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' возвращает 1-й элемент, а не сокращенный массив. – 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) {' будет в текущей форме * всегда * оценивать значение '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 
} 
Смежные вопросы