Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » Import данных в MySQL из CSV

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

Draper



...by Draper!
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Смысл такой: есть файл
(CSV - Это файл, где данные такого плана:
 
123,456,678
123,456,789
123,456,789
 
т.е. Разделены запятой и переносом строки.)
 
Мне надо закачать этот файл на сервер, открыть его там, считать данные с него и занести в MySQL.
 
В итоге в MySQL долно получится:
 
ID      Name  Price  
 
123    456     789
123    456     789
123    456     789
 
 
Народ, плиз, код с примером, потому-что с таким встречаюсь первый раз, а надо понять что есть что! Желательно пошагово, начиная с upload файла на сервер и закагчивая заносом в базу...  

Всего записей: 265 | Зарегистр. 09-08-2001 | Отправлено: 06:23 01-09-2003 | Исправлено: Draper, 06:58 02-09-2003
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вот так.. к примеру.. DB_HOST и так далее - данные базы данных
а насчет аплоада - хороший пример есть в manual www.php.net
<?
 $link = @mysql_pconnect(DB_HOST, DB_UID, DB_PWD);
        if ($link) {
            mysql_select_db(DB_DB);
        } else {
            exit("Unable to connect to database.  Please try again later.\n");
        }  
 
$data=file('путь к файлу');
if (is_array($data))
  {
   foreach ($data as $string)
      {
       $temp=explode(",",$string);
       $query="INSERT INTO table_name SET id='$temp[0]',Name='$temp[1]',Price='$temp[2]'";
       $result=mysql_query($query);
      }
   }
?>


----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 06:37 01-09-2003 | Исправлено: Cheery, 07:10 01-09-2003
Draper



...by Draper!
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery
 
Спасибо...очень сильно помог!
 
 
 
Отредактировано:
 
Мдяяя...поковырялся весь день и вот к чему пришел:
 
Все работает на ура, но если в Microsoft Excel есть ячейки с запятыми, например адресс, то он сохронает CSV файл такого плана:
 
NSN-2A , BA , John Travolta , "123 Trump Street, Brooklyn, NY  112345  USA" , 124.00
 
Т.е. то поле где есть запятая он ставит в кавычки. А при обработке скриптом, скрипт считывает поле с адресом как 3 раздельных поля и соответственно вставляет в базу в 3 разных поля... что посоветуешь? Как мне это поле с запятыми иметь как одно?

Всего записей: 265 | Зарегистр. 09-08-2001 | Отправлено: 00:06 02-09-2003 | Исправлено: Draper, 06:40 02-09-2003
quasar



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
если ты заметил, то поля у тебя разделяются запятой с пробелами...а в адресе пробелов нет...
 
попробуй заменить
 
$temp=explode(",",$string);  
 
на  
 
$temp=explode(" , ",$string);
 
 
(Оффтопик: Функции explode меня только вчера здесь научили! )

Всего записей: 398 | Зарегистр. 29-01-2002 | Отправлено: 16:42 03-09-2003 | Исправлено: quasar, 16:47 03-09-2003
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Draper
У тебя есть адрес.. и остальные ячейки  - там только цифры?

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 17:59 03-09-2003
Draper



...by Draper!
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нет...смотрите, у меня таблица такого вида:
 
john travolta     123 Test Street, Brooklyn, NY  11218 USA
 
 
3 раздельных ячейки (имя, адресс и сумма)
 
При сохранении в CSV получается файл такого содержания:
 
john travolta,"123 Test Street, Brooklyn, NY  11218 USA"
 
Т.е. те поял которые имеют запятые, он ставит в кавычи! Понятное дело что при разбивке через запятую скрипт видит 5 поле, а надо 3!
 
Если ты имеешь ввиду какие поля могут иметь запятую, то у меня должно быть 7 полей. 3,4,5 могут иметь запятые в данных.
 
Что посоветуешь?

Всего записей: 265 | Зарегистр. 09-08-2001 | Отправлено: 19:08 03-09-2003
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Draper
Держи.. пример:
$string='john travolta, "123 Test Street, Brooklyn, NY 11218 USA", 11345';
$data=preg_split("/(\,\s*\")|(\"\s*\,)/",$string);
print_r($data);

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 20:55 03-09-2003
Draper



...by Draper!
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Сделал как ты сказал, но столкнулся с другой проблемой...
 
1) Получается
 
Array ( [0] => NSN-2A,RCF,John Travolta [1] => 508 Copney Island Ave., Brooklyn, NY 11218 USA [2] => no,0,0 )
 
3 Array. Первый Array я разбиваю еще раз на 3 части и с ним нет проблем. 2 Array я оставляю как есть. Теперь с 3 Array у меня загвоздка! Поле там где написано "no" может соделжать, а может и нет ",". Это поле для заметок! Пока я его тоже разбиваб на 3 части, но как только поле содержит "," Array само сабой сдвигается, ну и соответственно в базу заноситья не та инфа. Понятно что я сделал 1.000.000 ограничений для пользователей типа графа адреса обязательно должна иметь запятую а графа заметок нет! Тогда все в ажуре! А если без ограничений? Можно ли сделать чтоб изначально инфа была разбита в Array независимо от запятой!

Всего записей: 265 | Зарегистр. 09-08-2001 | Отправлено: 23:52 03-09-2003
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Draper
и в чем проблема? считаешь количество элементов там.. если два, значит нет комментария и нужно все сместить.. если 3, то он есть..
www.php.net/count

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 00:01 04-09-2003 | Исправлено: Cheery, 00:04 04-09-2003
Draper



...by Draper!
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ok...вроде получилось! Всем спасибо!!!

Всего записей: 265 | Зарегистр. 09-08-2001 | Отправлено: 01:35 04-09-2003
andrewfan

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Посмотри синтаксис  
LOAD DATA INFILE
Быть может поможет. Тогда одним запросом можно делать все что ты хотел, при этом есть механизм различия полей в которых есть запятые и никаких проблем не возникает, настраивается достаточно гибко.
 
Добавлено
Посмотри синтаксис  
LOAD DATA INFILE
Быть может поможет. Тогда одним запросом можно делать все что ты хотел, при этом есть механизм различия полей в которых есть запятые и никаких проблем не возникает, настраивается достаточно гибко.

Всего записей: 1 | Зарегистр. 05-09-2003 | Отправлено: 15:19 05-09-2003
SparcoCF

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Использую данный скрипт для импорта данных в базу из CSV файла:

Код:
 
<?
 $link = @mysql_pconnect(DB_HOST, DB_UID, DB_PWD);
        if ($link) {
            mysql_select_db(DB_DB);
        } else {
            exit("Unable to connect to database.  Please try again later.\n");
        }  
 
$data=file('путь к файлу');
if (is_array($data))
  {
   foreach ($data as $string)
      {
       $temp=explode(",",$string);
       $query="INSERT INTO table_name SET id='$temp[0]',Name='$temp[1]',Price='$temp[2]'";
       $result=mysql_query($query);
      }
   }
?>  
 

 
Загружает все отлично.
Но у меня вопрос, допустим база уже заполнена и это данные прайс листа, я хочу этот прайс обновить, и делаю такой запрос:

Код:
 
$query="UPDATE table_name SET id='$temp[0]',Name='$temp[1]',Price='$temp[2]'";
 

 
но все строки таблицы заполняются одними и теми же данными что соответствуют первой строке CSV файла.
Как должен выглядеть запрос что бы таблица заполнялась соответствующими данными ?

Всего записей: 110 | Зарегистр. 21-03-2009 | Отправлено: 22:57 15-05-2009
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SparcoCF

Цитата:
Как должен выглядеть запрос что бы таблица заполнялась соответствующими данными ?  

для обновления нужно указывать какие данные обновлять.
должно быть условие WHERE id= id конкретным данным из файла

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 22:58 15-05-2009 | Исправлено: Cheery, 23:03 15-05-2009
SparcoCF

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
WHERE id= id данным из файла

 
а если в самом CSV файле нет такого столбца как id ? Нужно добавить такой, или есть еще какой то вариант ?

Всего записей: 110 | Зарегистр. 21-03-2009 | Отправлено: 23:02 15-05-2009
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SparcoCF

Цитата:
а если в самом CSV файле нет такого столбца как id ?

я привел как пример.
должен быть какой то идентификатор, связывающий данные в базе и в файле.  
иначе как вы поймете ГДЕ ИМЕННО обновлять данные?

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 23:04 15-05-2009
SparcoCF

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Понял, сделал вот так:
 
CSV файл:
 

Код:
 
Nomer Imya Cena
1;One;456;
2;Two;444;
3;Three;340;

 
запрос:

Код:
 
$query="UPDATE table_name SET id='$temp[0]',Name='$temp[1]',Price='$temp[2]' WHERE id=Nomer";  
 

 
так правильно ? Или шапка CSV должна как то выглядеть иначе ?

Всего записей: 110 | Зарегистр. 21-03-2009 | Отправлено: 23:11 15-05-2009
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SparcoCF

Цитата:
так правильно ? Или шапка CSV должна как то выглядеть иначе ?

мда.. вы вообще понимаете что делаете и зачем?
 
начнем с простого - зачем вы делаете "update"? вы хотите обновить данные для уже существующих в базе объектов?  
если так, то у каждого из них должен быть уникальный id, который, так же, записан в csv файле именно для этого объекта. и только тогда используя запрос с WHERE можно обновить данные именно ЭТОГО объекта.
   


----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 23:14 15-05-2009
SparcoCF

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
понял, сделал и получилось .. спасибо
 
и все таки поспешился  я с выводом.
 
CSV файл:

Код:
 
1;123;75.2
2;124;75.58
3;125;75.35
 

 
как должен выглядеть все таки запрос ?:

Код:
 
$query="UPDATE price SET id='$temp[0]',Name='$temp[1]',Price='$temp[2]' WHERE id";
 

 
если делаю WHERE id>0
получаю ошибку Duplicate entry '3' for key 1
 
Добавлено:
какие уже манипуляции не делал с WHERE ничего не получается
 
Добавлено:
И вот наконец то результат:
$query="UPDATE price SET id='$temp[0]',Name='$temp[1]',Price='$temp[2]' WHERE id='$temp[0]'";

Всего записей: 110 | Зарегистр. 21-03-2009 | Отправлено: 23:17 15-05-2009 | Исправлено: SparcoCF, 00:05 16-05-2009
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SparcoCF

Цитата:
id='$temp[0]'

зачем лишние вещи в SET? вы же не собираетесь менять id

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 05:07 16-05-2009
SparcoCF

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору


Цитата:
зачем лишние вещи в SET? вы же не собираетесь менять id  

Спасибо, учел.
 
Нашел еще один метод для парсинга CSV файла это функция fgetcsv()
Какие ее преимущества и недостатки ? Стоит может ею пользоваться ? или существенной разницы нет между методами ?

Всего записей: 110 | Зарегистр. 21-03-2009 | Отправлено: 13:20 16-05-2009
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Интернет » Web-программирование » Import данных в MySQL из CSV


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru