2012-01-15 3 views
0

Я использую следующий скрипт для импорта данных в базу данных mysql из файлов CSV. CSV настроен так:Загрузка CSV-файла и импорт в mysql с ошибкой

Name Postcode 
fred hd435hg 
bob dh345fj 

Над то, что это выглядит как в Excel, в необработанном формате CSV смотреть в блокнот это выглядит следующим образом:

name,postcode 
frank,ng435tj 

Проблема У меня есть для некоторых Причина, по которой столбец почтового индекса вообще не импортируется, также загорается строка заголовка как запись, можно ли пропустить первую строку ?. Я прошел через код и не могу понять, почему почтовый индекс не втягивается, это очень странно.

 <?php 
    //database connect info here 

    //check for file upload 
    if(isset($_FILES['csv_file']) && is_uploaded_file($_FILES['csv_file']['tmp_name'])){ 

     //upload directory 
     $upload_dir = "./csv"; 

     //create file name 
     $file_path = $upload_dir . $_FILES['csv_file']['name']; 

     //move uploaded file to upload dir 
     if (!move_uploaded_file($_FILES['csv_file']['tmp_name'], $file_path)) { 

      //error moving upload file 
      echo "Error moving file upload"; 

     } 

     //open the csv file for reading 
     $handle = fopen($file_path, 'r'); 


     while (($data = fgetcsv($handle, 1000, ',')) !== FALSE) { 

      //Access field data in $data array ex. 
      $name = $data[0]; 
      $postcode = $data[1]; 

      //Use data to insert into db 
      $sql = sprintf("INSERT INTO test (name, postcode) VALUES ('%s',%d)", 
         mysql_real_escape_string($name), 
         $postcode 
         ); 
      mysql_query($sql) or (mysql_query("ROLLBACK") and die(mysql_error() . " - $sql")); 
     } 


     //delete csv file 
     unlink($file_path); 
    } 
    ?> 

ответ

2

Ваш CSV-файл, по-видимому, является файлом TSV. Он не использует запятые, а табуляторы для разделения полей.

Поэтому вам необходимо изменить вызов fgetcsv. Вместо ',' использовать вкладку:

while (($data = fgetcsv($handle, 1000, "\t") ... 

А также пропустить строку заголовка, добавьте еще одну искусственную fgetcsv перед блоком в то время:

fgetcsv($handle); 
while (...) { 

Это пропустит первую строчку. (Простой fgets также не будет делать.)


О, только что заметил: почтовый индекс может также опускаться, потому что вы Concat его в строку в десятичное с sprintf заполнителем %d для $postcode. Если это поле действительно содержит буквенные символы, как в вашем примере, это не сработает. - Хотя я предполагаю, что это всего лишь неверная распечатка.

+0

Привет, извините, то потому что я открывал его в Excel, если я открыть его в блокноте он выглядит как этот – user1148760

+0

имя, почтовый индекс откровенны, ng435tj – user1148760

+0

Ой, ладно. Тогда, пожалуйста, игнорируйте все мои теории до этого момента. – mario

0

Попробуйте этот.

$file = $_FILES['file']['tmp_name']; 

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

     while(($fileop = fgetcsv($handle,1000,",")) !==false) 
     { 
      $username = $fileop[0]; 
      $name = $fileop[1]; 
      $address = $fileop[2]; 

      $sql = mysql_query("INSERT INTO ...... "); 
     }