Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [inne][PHP]Dane z pliku .CSV do bazy danych
Forum PHP.pl > Forum > Przedszkole
Mades
Bawię się trochę i nie mam pomysłu jak poradzić sobie z tym. Załóżmy mamy taki plik .csv:

  1. "2013-11-08 pt.";"1";"1A TE";"Matematyka";"Jan Nowak";"zajęcia odwołane";"";
  2. "2013-11-08 pt.";"3";"2J TE";"Matematyka";"Jan Nowak";"zajęcia odwołane";"";
  3. "2013-11-08 pt.";"2";"3C TE";"Matematyka";"Jan Nowak";"zajęcia odwołane";"";


Dodatkowo zrobiłem sobie taką strukturę bazy danych:

  1. CREATE TABLE IF NOT EXISTS `mtz_zastepstwa` (
  2. `Data1` date NOT NULL,
  3. `Data2` date NOT NULL,
  4. `Lekcja1` smallint(6) NOT NULL,
  5. `Lekcja2` smallint(6) NOT NULL,
  6. `Klasa` varchar(16) COLLATE utf8_unicode_ci NOT NULL,
  7. `Przedmiot` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
  8. `Nauczyciel_nieobecny` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
  9. `Nauczyciel_zastepujacy` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
  10. `Zastepstwa_id` int(11) NOT NULL AUTO_INCREMENT,
  11. PRIMARY KEY (`Zastepstwa_id`)
  12. )


Za cholerę nie wiem jak z pliku .csv wrzucać dane do bazy danych.
Mógłby ktoś to na jakimś skrypcie przykładowo zaprezentować?

Pozdrawiam.
memory
  1. LOAD DATA INFILE 'detection.csv'
  2. INTO TABLE calldetections
  3. FIELDS TERMINATED BY ','
  4. OPTIONALLY ENCLOSED BY '"'
  5. LINES TERMINATED BY '\r\n'
Gość
Pomyliłeś parametr enclosure z http://us2.php.net/fgetcsv

Zamień
  1. } while ($data = fgetcsv($handle,1000,";","'"));


na

  1. } while ($data = fgetcsv($handle,1000,";",'"'));

(zmieniony apost. na cudzyslow.)
rocktech.pl
Witam.

Mades kombinujesz jak koń pod górę. Memory podał ci najbardziej optymalne i elegancie rozwiązanie.

  1. LOAD DATA INFILE 'detection.csv'
  2. INTO TABLE zastepstwazse
  3. FIELDS TERMINATED BY ':' -- separtaor pola masz ':' a nie ','
  4. OPTIONALLY ENCLOSED BY '"'
  5. LINES TERMINATED BY '\r\n'


Zajrzyj tu znajdziesz przykłady http://dev.mysql.com/doc/refman/5.1/en/load-data.html łącznie z obróbką daty w formacie "2013-11-07 czw" facepalmxd.gif
A co do tego "foreacha" jeśli uprzesz się przy w.w rozwiązaniu to chyba jesteś w stanie dojść krok po kroku gdzie jest błąd...
Mades
Walić to, nie mam już sił do tego gówna. Zechciało się csv.
Już próbowałem zrobić to tak jak napisałeś wyżej, ale za cholerę nie chce wejść to do bazy danych. Sorry, ale pieprzę się z tym drugi dzień i już nie mam nerwów na to.
Cytat
"Data";"Nr lekcji";"Klasa";"Przedmiot";"Nauczyciel nieobecny";"Nauczyciel zastępujący";"Sala";
"2013-11-07 czw. -> 2013-11-08 pt.";"1 -> 9";"3G TE";"Język polski";"Skutnik Magdalena";"Skutnik Magdalena";"";
"2013-11-15 pt. -> 2013-11-08 pt.";"1 -> 2";"4G TE";"Wiedza o kulturze";"Wołkowycka Katarzyna";"Wołkowycka Katarzyna";"";
"2013-11-08 pt.";"1";"3D TE 3dt-2n";"Multimedia i grafika komputerowa";"Żelezniakowicz Michał";"zajęcia odwołane";"";
"2013-11-08 pt. -> 2013-11-15 pt.";"2 -> 1";"4G TE";"Podstawy przedsiębiorczości";"Dąbrowski Maciej";"Dąbrowski Maciej";"";
"2013-11-08 pt.";"2";"1B TE";"Podstawy elektrotechniki";"Matwiejczuk Jolanta";"Mieczkowski Piotr";"";
"2013-11-08 pt.";"2";"3D TE 3dt-2n";"Multimedia i grafika komputerowa";"Żelezniakowicz Michał";"zajęcia odwołane";"";

Nie chce to się upchać do bazy.
Próbowałem jakoś tak, znając mnie to zrobiłem jakiś banalny błąd, którego nie widzę.
  1. $quote = "&#34";
  2. $sql = "LOAD DATA INFILE 'contacts.csv'
  3. INTO TABLE zastepstwa
  4. FIELDS TERMINATED BY ';'
  5. OPTIONALLY ENCLOSED BY '$quote'
  6. LINES TERMINATED BY '\r\n'
  7. ";
  8. $rob = mysql_query($sql);
rocktech.pl
Bawisz się z tym już drugi dzień bo nie potrafiłeś poświęcić 30 min na próbę zrozumienia zapytania, które ci podsunięto!

  1. $sql = "LOAD DATA INFILE 'contacts.csv'
  2.  
  3. INTO TABLE zastepstwa
  4.  
  5. FIELDS TERMINATED BY ';'
  6.  
  7. OPTIONALLY ENCLOSED BY '\"'
  8.  
  9. LINES TERMINATED BY '\r\n'";
Gość
Oj chyba troche mylicie koledze. Trzeba pamietac o tym gdzie w przypadku odpalania zapytania `LOAD DATA INFILE` ma leżeć plik csv, a to może nie koniecznie być takie proste jak zapytanie odpalamy z PHPa. Zapytanie podane w tej formie ktora jest wyzej, nie zadziala w wiekszosci wypadkow.


Najlepiej podać ścieżkę bezwzględną do pliku (czyli "C:/sciezka/do/pliku.csv" - domyslam sie ze dzialasz na windowsie) i wykonac zapytanie bezposrednio na bazie danych (moze byc problem z uprawnieniami do pliku, jezeli robimy to przez php, ale nie musi).

com
@up no chyba nie.. tak to chyba na localhost ale itak scieżka c:/... jest jakimś żartem wink.gif
Btw autor chyba wie gdzie ma ten plik nie sądzisz?
Gość
To, że autor wie gdzie ma plik, nie znaczy ze baza danych wie.
Wykonujac zapytanie load data bez podania sciezki bezwzglednej, mysql szuka pliku wzgledem plikow aktywnej bazy danych. W moim przypadku plik nalezaloby umiescic w : "/var/lib/mysql/db/contacts.csv". Prawda, że intuicyjne?

Niemniej sądze, że ktoś kto uczy się dopiero syntaxu LOAD DATA zostanie najzwyczajniej wprowadzony przez Ciebie w błąd w powyższy sposób.

Tak czy inaczej pozostaje podac sciezke bezwzgledna, lub wzgledną ale względem binarek bazy danych. Nie widze, dlaczego bezwzgledna mialaby byc zartem. Proszę, powiedz dlaczego tak uważasz, może się czegoś nauczę.
Pozdrawiam.
com
owszem moze być scieżka bezwzgledna ale wzgledem serwera a nie systemu...
Bo nie wiesz jaki autor ma system, tak samo nie wiesz jaki bedzie na produkcji.. pewnie linux ale moze być też windows...

zresztą podano link do manuala a tam wszystko jest napisane wink.gif
acquired didelsh
Ścieżka bezwględna względem... ?
>bezwzględna
>względem


Sądzę, że może dosyć już umyślnego wprowadzania w błąd.
Pamiętaj, że to przedszkole i albo piszesz tak aby pomagać, albo nie piszesz wcale. Nie można tutaj liczyć na to, że człowiek któremu odpowiadasz domyśli się czegoś, co dla ciebie jest oczywiste.

Co jest natomiast proste, to to, że zapytanie które podali koledzy NIE ZADZIAŁA. I jak widać po odpowiedziach autora, nie zadziałało. Nie ważne czy na serwerze, czy lokalnie, należy podać ścieżkę bezwzględną lub względną względem bazy danych, co wcale nie jest proste dla początkującego.

Pozdrawiam!
com
Cytat
Ścieżka bezwględna względem... ?
>bezwzględna
>względem

Czepiasz się zapisu a chodziło po prostu o to że nie odwołuje się do c:/.. tylko jak już do var/...
Spójrz co autor rozwiązania napisał:
Cytat

Wiec logiczne jest że zagląda się tam żeby zapoznać się z czymś z czym sie nie miało do czynienia... I własnie dlatego, że to jest przedszkole wiec dajemy konkretną odp... ale wszystkie szczegóły znajdzie w manualu po to on jest a nie po to żeby przepisywać go tutaj na nowo...
to o czym mówisz przecież tam zostało napisane... np.
  1. LOAD DATA INFILE '/tmp/test.txt' INTO TABLE test IGNORE 1 LINES;
Gość
Cytat
Czepiasz się zapisu a chodziło po prostu o to że nie odwołuje się do c:/.. tylko jak już do var/...

Przykro mi, ale nadal nie rozumiem dlaczego się tego tak uczepiłeś. Dlaczego nie odwoływać się do przykładowego c? Co w tym takiego smiesznego? Szanse,że kolega wyżej działa na windowsie, jak z lekka licząc 95% początkujących, są dosyć solidne. Łatwiej chyba przyznać się, że klepnąłeś coś nie pomyśliwszy, niż próbować z tego jakoś wybrnąć smile.gif (no ale, no ale linux przecież! produkcja... )

Cytat
Wiec logiczne jest że zagląda się tam żeby zapoznać się z czymś z czym sie nie miało do czynienia...

No, żeby to jeszcze było tam bezpośrednio opisane (nie z kontekstu) smile.gif Czytając odpowiedzi niestety wyszedłem z założenia, że nikt z "rozwiązujących" problem nie korzystał z tego zapytania, bo w przeciwnym wypadku najzwyaczajniej podali by ścieżke bezwzględną. Sam na tym się naciąłem nie raz, a pracuje już jako linux admin od kilku lat. Rodzynką na torcie jest roktech.pl który najpierw równa typka z ziemią ("nawet nie potrafiłeś ..." ) po czym poprawia błąd w enclose ktory nie ma wpływu na wykonanie zapytania ignorując oczywistą przyczynę błędu czyli brak poprawnej ścieżki. biggrin.gif

Nie chcę już za dużo offtopować, ale naprawdę panowie, w przedszkolu pomagajmy. smile.gif
com
to skoro posiadasz taka wiedzę to załóż konto, a nie pisz jako gość, bo próbujesz nam zarzucić niekompetencje, co Ci słabo idzie.. Mówisz że pracujesz na linux to czemu wciskasz rozwiązanie dla windows w dodatku locahosta? bo na jakim serwerze dadzą Ci dostęp do c:/... ? Ponadto gdzie autor podał, że testuje to na localu? a jak zrobi tak jak mu sugerujesz to zaraz przyleci z nowym postem i powie, że nie działa bo wpakował c:/ na serwie ... słusznie zwróciłeś uwagę na to że trzeba pamiętać o ścieżce do pliku, ale jak zastosuje c:/... to o przenośności może zapomnieć, a skoro jego założeniem było trzymanie danych w csv to chyba nie robi tego tylko po to żeby zawsze stosować to tylko na localhost... bo nawet jeśli teraz to tam odpala, to po to się teraz tego uczy żeby potem móc takie zastosowanie przenieść na produkcje... Wiec to Ty najpierw się zastanów a potem próbuj dyskutować... Bo jakby nie było to co tu wszyscy robią, sam dałbyś mu takie samo rozwiązanie wiec
Cytat
naprawdę panowie, w przedszkolu pomagajmy.
to jakieś gorzkie żale...

Poza tym slashe Ci się pomyliły bo na win masz \ a nie / , a pisałem tak samo bo "cytowałem" to co naskrobałeś wink.gif
Gość
Witam ponownie,

Niestety, ale interesuje mnie tylko techniczna strona zagadnienia, nie Twoje ładunki emocjonalne. Twój post od strony technicznej nie wniósł absolutnie nic. Nie udało Ci się wykazać dlaczego podanie ścieżki bezwzględnej na windowsie jest żartem.
Jedyne na co mogę odpowiedzieć, to wykazać błąd logiczny w rozumowaniu takim, iż uważasz za słuszne założyć, że kolega pracuje na linuksie ale założyć, że pracuje na windowsie lokalnie, już nie wolno. Ja natomiast uważam to za równoprawne założenia.

Od strony tech. nadal pozostaje fakt, że należy podać ścieżkę bezwzględną, lub względem baz danych co czyni każdy powyższy post mylącym.

Tyle w temacie. A jeżeli nawoływanie do pomagania nazywasz gorzkimi żalami, to niestety, ale już totanie nie rozumiem dlaczego.

PS. O ile dobrze pamiętam, na windowsie slashe można stosować zamiennie. Przynajmniej na pewno w linii komend. Więc żółć wylana, znów płynie na Ciebie.

Pozdrawiam, życzę wiecej podejścia technicznego, mniej emocjonalnego. Przyda się w dalszej pracy smile.gif
com
podanie ścieżki bezwzględnej na Windowsie nie jest żartem tylko pakowanie tego to co napisałeś c:/ bo zadziała mu to tylko w jednym konkretnym przypadku, wiec takie rozwiązanie w niczym mu nie pomaga... Bo ono ma być uniwersalne a nie robione pod localhosta... być może piszesz strony do szuflady, ale nie zakładaj ze każdy tak robi...

Uwierz kolego jestem na tym forum już jakiś czas i nie trudno było zaobserwować, że połowa osób która ma tu jakiś problem, albo nie potrafi czytać dokumentacji albo jak dostaje prawie gotowe to im się wydaje, że wystarczy to już skopiować 1 do jeden i zacznie im działać... A to forum jest po to żeby dać takim osobą rzetelne wskazówki, a nie gotowca, jeśli chcą gotowca to jest takie miejsce jak zlecę.. Bo w ten sposób niczego się nie nauczą i marne są szanse na to żeby zaistnieć w tym zawodzie...

Można stosować, dlatego, że są tacy dla których slash w ta / czy w tą \ to to samo... Wiec potem pojawiają się rozwiązania idiotoodporne, ale skoro już podajesz adres dla Windows to podawaj w windowsowy sposób, a nie jak Ci się podoba...

A osoby podające rozwiązanie podały takie jak podają w manualu, z modyfikacja pod konkrety problem, wiec to jest jakaś twoja mylna nadinterpretacja...

Jakbyśmy nie pomagali to by nikt nie napisał o LOAD DATA INFILE i nie było by tej dyskusji... Tylko jak się jest zaślepiony własnym ego to się potem nie widzi oczywistych rzeczy... I to nie ja podszedłem do tego emocjonalnie tylko Ty, bo to Tobie się zabrało na dywersje na temat tego co napisałem chociażby w poście http://forum.php.pl/index.php?s=&showt...t&p=1076761 , gdzie można było zakończyć tą dyskusje.. Cytujac:

Cytat
Bo nie wiesz jaki autor ma system, tak samo nie wiesz jaki będzie na produkcji.. pewnie linux ale może być też Windows...

zresztą podano link do manuala a tam wszystko jest napisane
Wiec jakbyś nie zauważył napisałem to w 2 zdaniach co próbowałeś mi powiedzieć teraz... Tylko tak to jest jak się czyta wyrywkowo i tylko to co komu pasuje...

Podsumowując nie zrozumiałeś mojego przekazy, czytanie ze zrozumieniem się kłania.. i stąd pewnie cała twoja dygresja smile.gif
Pozdrawiam
Gość
Cytat
być może piszesz strony do szuflady, ale nie zakładaj ze każdy tak robi... (...) Tylko jak się jest zaślepiony własnym ego to się potem nie widzi oczywistych rzeczy...

http://pl.wikipedia.org/wiki/Argumentum_ad_personam
Nic do dodania.


Wracając jednak do tematu
Cytat
nie jest żartem tylko pakowanie tego to co napisałeś c:/ bo zadziała mu to tylko w jednym konkretnym przypadku, wiec takie rozwiązanie w niczym mu nie pomaga

Sądzę, że idziesz w zaparte, ponieważ nie do końca rozumiesz istotę problemu.
Pozwolę sobie zatem wyjaśnić, mamy tak naprawdę dwie opcje :
-Podać ścieżkę bezwzględną.
-Podać ścieżką wzgędem serwera.

Pierwsza zakłada brak przenośności.
Druga również zakłada brak przenośności. ( i tak nie unikniesz tego początkowego ../../../ oraz..... podania najzwyczajniej nastepnie katalogu bezwzglednie)

I w tym właśnie tkwi problem. To zapytanie nie ma przenośności. Jeżeli masz jakiś pomysł, jak zapewnić przenośność temu zapytaniu, to proszę bardzo. My natomiast u mnie w firmie zawsze stosowaliśmy ścieżki bezwzględne, a najlepsze co wymyśliliśmy to trzymanie ścieżki w configu. Przy przenoszeniu pomiędzy serwerem a localhostem zmieniany był config. Być może poświęciliśmy na to za mało czasu. Nie wiem.

Sądzę, że teraz bardziej rozumiesz, dlaczego tak a nie inaczej zareagowałem na Twoj komentarz. ("Proszę, powiedz dlaczego tak uważasz, może się czegoś nauczę.") Naprawdę sądziłem, że masz coś sensownego do dodania smile.gif

Niemniej jednak, póki nie masz - faktem pozostaje to, że wyśmiałeś poprawne rozwiązanie ("jest jakimś żartem!"). Wnioskuje również, że nie miałeś z nim wcześniej do czynienia, a nawet byćmoże go nie używałeś w praktyce - po tym, że napisałeś "autor chyba wie gdzie ma plik nie sądzisz?". Ale to tylko wniosek, mogę się oczywiście mylić.

Dodać mogę jeszcze jedynie tyle, że nie pisałbym w tym temacie tyle, gdyby nie fakt, że sam zęby zjadłem na tym, jak używałem pierwszy raz. I wręcz za znęcanie się uważam podsunięcie komuś w przedszkolu tego zapytania do wykonania w PHPie i nie wytłumaczenia, że ścieżka ma być relatywna wcale nie względem skryptu. Rozumiem, że warto uczyć czytać manuala, ale w tym przypadku manual nie opisuje tego problemu w sposób wystarczający do zrozumienia dla początkującego (naprawdę! zerknij).

Zatem ponawiam pytanie, dlaczego podanie ścieżki bezwzględnej jest żartem, lub nawołuje do przynania się do błędu. Tak aby była jasnośc. Dla przyszłych czytających ten temat, nie dla mnie.
c1chy
Autor chyba sobie już odpuścił pliki CSV smile.gif mimo wszystko od wersji MS-DOS 2.0 można używać / i \ a nawet pojawiała się opcja zmiany zupełnie separatora więc mogłoby to być cokolwiek. Dlatego też w PHP mamy na przykład stałą __DIR__ która zwróci nam bezwzględny adres nie zależnie od systemu operacyjnego, i znaku separatora. Więc da się napisać w miarę przenośne rozwiązanie pod warunkiem że założymy na przykład obecność pliku csv w tym samym katalogu co plik php.

Podawanie ścieżki względnej jest bardziej problematyczne ale również możliwe. Bo nie możemy założyć że MySQL zaczyna w tym samym katalogu co nasz skrypt PHP dlatego ścieżki powinny zawsze być bezwzględne chyba że doskonale wiemy o ile katalogów się cofnąć itd. to jednak nie ma sensu bo wystarczy mała zmiana w konfiguracji serwera i nam się skrypt wysypie.


com
@up i właśnie o to chodziło...

a jeśli nie __DIR__ to zawsze można użyć $_SERVER['DOCUMENT_ROOT'] ...

To Ty Gościu nie zrozumiałeś mojego przekazu i nadal go nie rozumiesz... Ścieżka bezwzględna jak najbardziej ale nie podawana na sztywno, dlatego zwróciłem Ci na to uwagę...
Cytat
Pozwolę sobie zatem wyjaśnić, mamy tak naprawdę dwie opcje :
-Podać ścieżkę bezwzględną.
-Podać ścieżką wzgędem serwera.

Mylisz się owszem są dwie możliwości ale one wyglądają tak:
-Podać ścieżkę bezwzględną. (czyli $_SERVER['DOCUMENT_ROOT'] , a nie c:\...
-Podać ścieżką wzgędem skryptu. (względną) ( tu oczywiście wygląda to tak jak mówisz ../.../...)
Jeszcze raz powtarzam czytaj ze zrozumieniem, bo na obojętnie jakim serwerze to odpalisz nie masz dostępu bezpośredniego do zasobu c:/..., tylko twoim zasobem bezwzględnym jest lokalizacja tam gdzie został zainstalowany serwer, myślę, że teraz to w końcu zrozumiesz, szczerze to szkoda że nie posiadasz konta bo w tym wątku było to nie potrzebne...

Oczywiście istnieje możliwość manipulacji tymi ścieżkami, co nawet pozwala na do stęp do serwerów obcych ale to nie ma związku z tym tematem..
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.