Загрузка файла CSV и импорт в MySQL приводит к ошибке - PullRequest
0 голосов
/ 15 января 2012

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

Name  Postcode
fred  hd435hg
bob   dh345fj

Выше показано, как это выглядит в Excel, в формате raw 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 ]

2 голосов
/ 15 января 2012

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

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

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

И чтобы пропустить строку заголовка, добавьте еще один искусственный fgetcsv перед блоком while:

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

Это пропустит первую строку. (Простой fgets тоже подойдет.)


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

0 голосов
/ 09 марта 2014

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

$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 ...... ");
        }
...