Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Import pliku csv do mysql
todziu
post 29.11.2010, 21:31:38
Post #1





Grupa: Zarejestrowani
Postów: 65
Pomógł: 0
Dołączył: 16.08.2006

Ostrzeżenie: (0%)
-----



ok juz sobie poradziłem z ta niezgodnością ver w poprzednim poscie ale powstał następny problem worriedsmiley.gif

plik csv wyglad tak:

  1. 5000159021692;SKITTLES FRUIT 125G.;3,99;0
  2. 5000159023061;MALTESERS 100G.;4,59;10
  3. 5000159028172;BOUNTY MINI 198G.;5,89;10
  4. 5000159314732;SNICKERS CRUNCHER BATON 40G.;1,09;20

i nie chcialbym przerabiac pliku csv bo jest to surowy plik wyeksportowany jako csv z excela

import do bazy wyglada tak:
  1. $wynik = mysql_query("LOAD DATA LOCAL INFILE '/tmp/test.csv' INTO TABLE `tychydisbaza` FIELDS TERMINATED BY ';' ENCLOSED BY '\"' ESCAPED BY '\\' LINES TERMINATED BY '\r\n'");


logi nic nie krzyczą blada mysql nie zwraca gdzie jest problem - dzieki za pomoc

Ten post edytował todziu 29.11.2010, 21:33:15
Go to the top of the page
+Quote Post
Quadina
post 2.12.2010, 20:14:56
Post #2





Grupa: Zarejestrowani
Postów: 200
Pomógł: 38
Dołączył: 1.12.2010
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Jak wrzucisz to do phpMyAdmina też nic nie otrzymujesz w zwrotce? Wydaje mi się, że jest to problem nie podania kolejności kolumn, chociaż mySql sobie z tym raczej radzi. Dziwi mnie brak jakiegokolwiek zwrotu o błędzie.


--------------------
Warsztat: NetBeans 7.2 Beta, PHP, MySQL, PostgreSQL, Symfony (<=1.4), Diem, Java, Sieci neuronowe
Go to the top of the page
+Quote Post
todziu
post 2.12.2010, 21:10:45
Post #3





Grupa: Zarejestrowani
Postów: 65
Pomógł: 0
Dołączył: 16.08.2006

Ostrzeżenie: (0%)
-----


No wlasnie import w PHPMyAdmin zwraca takim zapytaniem:

  1. LOAD DATA LOCAL INFILE '/tmp/phpdn1FcE' INTO TABLE `tychydisbaza` FIELDS TERMINATED BY ';' ENCLOSED BY '"' ESCAPED BY '\\' LINES TERMINATED BY '\r\n'


skopiowano pomyslnie xxxx wierszy i to wszystko
Go to the top of the page
+Quote Post
Quadina
post 2.12.2010, 22:20:22
Post #4





Grupa: Zarejestrowani
Postów: 200
Pomógł: 38
Dołączył: 1.12.2010
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


To może masz problem z prawami to pliku /tmp/test.csv ? Bo to by oznaczalo, że jesteś rootem na tej maszynie, bo masz dostęp do folderu /tmp/, a ta możesz dodać plik jako root, którego już niestety mysql nie odczyta. Spróbuj dodać tam 0777, albo zmienić właściciela pliku.

Ewentualnie dodaj ścieżkę względną do tego CSV smile.gif


--------------------
Warsztat: NetBeans 7.2 Beta, PHP, MySQL, PostgreSQL, Symfony (<=1.4), Diem, Java, Sieci neuronowe
Go to the top of the page
+Quote Post
todziu
post 2.12.2010, 22:38:57
Post #5





Grupa: Zarejestrowani
Postów: 65
Pomógł: 0
Dołączył: 16.08.2006

Ostrzeżenie: (0%)
-----


no tak ale o tym juz log powinien krzyczec dry.gif
Go to the top of the page
+Quote Post
Quadina
post 2.12.2010, 23:13:42
Post #6





Grupa: Zarejestrowani
Postów: 200
Pomógł: 38
Dołączył: 1.12.2010
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


No własnie z doświadczenia wiem, że LOAD DATA się dziwnie zachowuje zawsze, przy czym w 25% przypadków, nawet nie powie, że coś się nie udało. Ale może to po prostu mój brak wiedzy :-)

Wracając do tematu, jeżeli uważasz że masz prawa do tego pliku i mySQL go widzi, to spróbuj dodać w taki sposób jakiś fakowy plik typu 1;2;3;4 po to tylko, żeby zobaczyć czy się zaciąga. Jeżeli coś się udaje phpMyAdminowi to niekoniecznie uda Ci się to przy normalnym połączeniu. Poszukam Ci jutro coś w manualu SQLa o tym, sam też zaglądnij, dzisiaj już czas do wyrka ;-)


--------------------
Warsztat: NetBeans 7.2 Beta, PHP, MySQL, PostgreSQL, Symfony (<=1.4), Diem, Java, Sieci neuronowe
Go to the top of the page
+Quote Post
todziu
post 3.12.2010, 15:46:04
Post #7





Grupa: Zarejestrowani
Postów: 65
Pomógł: 0
Dołączył: 16.08.2006

Ostrzeżenie: (0%)
-----


Qrde juz nie mam sily do tego LOAD DATA.. z poziomu php

moj plik importu

import.php
  1. include("config.php");
  2. $link = mysql_connect($url,$log,$pas) or die(mysql_error());
  3. $wynik = mysql_query("load data infile '/var/www/htdocs/import/test.csv' into table tychydisbaza fields terminated by ';' lines terminated by '\r\n' (plu_ty, nazwa, cena_ty, marza_ty)");
  4. mysql_close($link);
  5.  
  6. ?>


w logach "ZERO" i nie importuje danych z pliku test.csv natomiast z poziomu konsoli dziala bez ploblemu -->

  1. mysql -u root BAZA < LOAD DATA INFILE '/var/www/htdocs/import/test.csv into table tychydisbaza fields terminated by ';' optionally enclosed by '"' lines terminated by '\r\n' (plu_ty, nazwa, cena_ty, marza_ty); -phaslo


chyba to zrobie na funkcji exec... dry.gif

Ten post edytował todziu 3.12.2010, 15:49:46
Go to the top of the page
+Quote Post
Quadina
post 3.12.2010, 17:17:25
Post #8





Grupa: Zarejestrowani
Postów: 200
Pomógł: 38
Dołączył: 1.12.2010
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Doszukałem się informacji, że PHP może nie mieć odpowiednich uprawnień do wykonania takiej akcji, ale można to obejść nadająć folderowi i plikowi 0755 i wykonując:
  1. LOAD DATA LOCAL INFILE ...

Spróbuj proszę, bo sam ciekawy jestem czy tak pójdzie ;-)

Ten post edytował Quadina 3.12.2010, 17:18:27


--------------------
Warsztat: NetBeans 7.2 Beta, PHP, MySQL, PostgreSQL, Symfony (<=1.4), Diem, Java, Sieci neuronowe
Go to the top of the page
+Quote Post
todziu
post 3.12.2010, 23:42:42
Post #9





Grupa: Zarejestrowani
Postów: 65
Pomógł: 0
Dołączył: 16.08.2006

Ostrzeżenie: (0%)
-----


No niestety nie działa sciana.gif

plik import.php
  1. <?php
  2. include("config.php");
  3. $link = mysql_connect($url,$log,$pas) or die(mysql_error());
  4. $wynik = mysql_query("load data local infile '/tmp/test.csv' into table tychydisbaza fields terminated by ';' lines terminated by '\r\n' (plu_ty, nazwa, cena_ty, marza_ty)");
  5. mysql_close($link);
  6. ?>


prawa do pliku:
-rwxr-xr-x 1 root root 337 2010-12-04 00:21 import.php
prawa do katalogu:
drwxr-xr-x 4 root root 4096 2010-12-04 00:21 import/

próbowałem plik test.csv importować z katalogu /tmp jak i z katalogu /var/www/htdocs/import widziany z zewnątrz - import zakończony niepowodzeniem

error_log nic nie wydala :/

pozdr. spadam spac
Go to the top of the page
+Quote Post
Quadina
post 4.12.2010, 08:08:32
Post #10





Grupa: Zarejestrowani
Postów: 200
Pomógł: 38
Dołączył: 1.12.2010
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Teraz Ci powiem, żeby oczywiście większe jaja byly ;-) Że mi Twój skrypt załadował Twoje przykładowe dane do pseudotabeli postawionej na varcharach ;-)

Wydaje mi się w takim razie, że to kwestia praw albo w mySQL, albo jakiejś konfiguracji na Twoim serwerze. Niestety zaczęły mi się kończyć pomysły, zatem nie pozostaje mi nic innego jak po prostu zaproponować Ci skrypt odczytujący csv i ładujący go wiersz po wierszu ;-)


--------------------
Warsztat: NetBeans 7.2 Beta, PHP, MySQL, PostgreSQL, Symfony (<=1.4), Diem, Java, Sieci neuronowe
Go to the top of the page
+Quote Post
todziu
post 4.12.2010, 09:05:55
Post #11





Grupa: Zarejestrowani
Postów: 65
Pomógł: 0
Dołączył: 16.08.2006

Ostrzeżenie: (0%)
-----


oooo smile.gif juz to wczesniej przerabialem insert wiersz po wierszu i tak 90tys razy bo tyle mam wierszy do importu obciazenie CPU 99% a czas wykonywania skryptu ustawilem na 10min ale i tak nie pomoglo - zawiesil sie - ale dziwna sprawa przy takim zapisie z

load data local infile...

mysql krzyczy :
The used command is not allowed with this MySQL version

jezeli pominę LOCAL
Access denied for user 'todziu'@'Linux' (using password: YES)

jezeli napisze zwyklego selecta ktory pobiera 1 rekord z bazy przy tych samych ustawieniach bezproblemu laczy sie z baza
Go to the top of the page
+Quote Post
Quadina
post 4.12.2010, 12:19:16
Post #12





Grupa: Zarejestrowani
Postów: 200
Pomógł: 38
Dołączył: 1.12.2010
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


http://dev.mysql.com/doc/refman/5.0/en/load-data-local.html

W takim razie odpowiedź jest jedna. Twój serwer jest tak skonfigurowany, że PHP nie będzie miało uprawnień do wykonania LOAD DATA. Musiało by być przekompilowane z odpowiednią dyrektywą. W takim razie nie pozostaje nic innego jak exec() :/ Co nie jest zbyt ciekawym rozwiązaniem...

Co do wysyłania przez skrypt. Zgadzam się, że jest to dość toporne. Ale przy takim dużym pliku możesz ładować zasadą phpMyAdmina. To znaczy, że wysyłasz w INSERT VALUES w nawiasach więcej informacji, np. paczki po 50-100 sztuk. Dzięki przejściu fopen('','r') możesz przechodzić przez plik nie przeładowując pamięci. Więc można zoptymalizować skrypt z 10 minut nawet do jednej. W razie co mogę Ci tutaj przedstawić jakieś moje wersje takiego cuda, ale to już po weekendzie. Niestety obowiązki na uczelni nie pozwalają.


--------------------
Warsztat: NetBeans 7.2 Beta, PHP, MySQL, PostgreSQL, Symfony (<=1.4), Diem, Java, Sieci neuronowe
Go to the top of the page
+Quote Post
todziu
post 4.12.2010, 14:23:57
Post #13





Grupa: Zarejestrowani
Postów: 65
Pomógł: 0
Dołączył: 16.08.2006

Ostrzeżenie: (0%)
-----


ok poprosze- generalnie chodzi mi o to - mam 2 duze pliki w xls okolo 90tys reakordow i musze z tych dwóch plików znaleźć cześć wspólna czyli na zasadzie porownania wartosci w obu plikach - i takie zest musze robic w pracy co jakis czas - i nie ukrywam ze mi troszke czasu na to zchodzi import export itp do tej pory bylo tak oba pliki importowalem poprzez phpmyadmin do mysql tam pisalem zapytanie ktore mi wywalilo wszystki rekordy ktore wystepuja w obu bazach i zapisywalem to do xls w Mysql Query Browser - no i nadszedl czas zoptymalizowac ten proces :-) - i wlasnie chce zrobic aby uzytkownik poprzez www sam wrzucal plik w csv autom. import do bazy z odpowiednim zapatyniem a spowrotem dosteja plik wynikowy w csv

Go to the top of the page
+Quote Post
Pilsener
post 5.12.2010, 00:13:51
Post #14





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


Cytat
INSERT VALUES w nawiasach więcej informacji, np. paczki po 50-100 sztuk
- to też nie zawsze przejdzie, najgorsze w tym jest to, że potrafi się część danych załadować a nie dostaniesz żadnego info.
Cytat
duze pliki w xls okolo 90tys reakordow
- no bez jaj, 90 tys. to dużo? Z powodzeniem ładowałem LOAD DATA pliki po milion rekordów, spokojnie ładowało się w tle i nie było problemów, ja robiłem to tak:
  1. $pliczek = "/public/upload/do_bazy.txt";
  2. $zapyt = "LOAD DATA LOCAL INFILE '$pliczek' IGNORE INTO TABLE dane FIELDS TERMINATED BY ';' IGNORE 1 LINES";


Wrzucasz ten plik do 'public'? Nie może być "access denied" jeśli do pliku każdy ma dostęp, to nielogiczne. Warto też tu poczytać:
http://dev.mysql.com/doc/refman/5.1/en/load-data.html

I sprawdź wersje mysqla, za nieaktualizowanie oprogramowania adminów serwerów należy karać winksmiley.jpg
Go to the top of the page
+Quote Post
todziu
post 7.12.2010, 08:27:26
Post #15





Grupa: Zarejestrowani
Postów: 65
Pomógł: 0
Dołączył: 16.08.2006

Ostrzeżenie: (0%)
-----


No niestety ten import z poziomu php również nie przeszedł - ver serwera MySql 4.1.14, PHP Ver. 4.4.0- natomiast poprzez funkcję exec importuje bez problemu także myślę, że to nie jest wina ver mysql bo to samo zapytanie wykonuje sie bez problemu z shell-a - ale dzieki za info ważne, że sie importuje jeszcze tylko pozostał mi export wyniku zapytania do pliku csv.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 20.05.2025 - 14:35