![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 60 Pomógł: 0 Dołączył: 10.03.2012 Ostrzeżenie: (0%) ![]() ![]() |
Witam.
Tak szukam, szukam i nie mogę znaleźć odpowiedniego rozwiązania. Może ktoś mnie naprowadzi na właściwe tory. Dodam, że nie zajmuję się programowaniem zawodowo - raczej z doskoku. Więc tak, mam kod, który pobiera wiersze z pliku csv:
Wszystko ładnie działa, poszczególne wiersze wskakują do sformatowanej tabelki i teraz chciałbym załadować te dane do tabeli w bazie MySQL. Kombinuję od jakiegoś czasu z LOAD DATA INFILE ale nie mogę tego poprawnie rozwiązać. Może jakieś sugestie ?. |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 711 Pomógł: 127 Dołączył: 5.07.2008 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Zwykły insert wystarczy (o ile nie masz tam astronomicznej ilości wierszy)
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 60 Pomógł: 0 Dołączył: 10.03.2012 Ostrzeżenie: (0%) ![]() ![]() |
Zwykły insert wystarczy (o ile nie masz tam astronomicznej ilości wierszy) Wierszy jest nie dużo - ok. 1000 za każdym importem. Korzystając z twojej rady naskrobałem poniższy kod:
Niestety coś nie działa tak jak powinno i nie mogę tego rozgryźć. Nie wyskakuje żaden błąd, a do bazy dodaje się tylko jeden pusty rekord. Zwiększeniu o liczbę wierszy w pliku csv ulega także wartość pierwszego pola 'id', które ma ustawione auto_increment. Poniże struktura pliku csv: idWniosku;idWewnetrzneWniosku;idUzytkownika;idPytajacego;dataZlozenia;dataWaznos ci;dataOdpowiedzi;nazwaInstytucji 201201012100179468;;SGK;ADMIN;2012-01-01;2012-01-08;2012-01-02 00:48:09;SGKOL |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 6 378 Pomógł: 1116 Dołączył: 30.08.2006 Ostrzeżenie: (0%) ![]() ![]() |
Myślałeś żeby:
a) Przepisać to pod PDO z przygotowanym zapytaniem i dla każdego rekordu wykonywać execute ![]() ? -------------------- |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 60 Pomógł: 0 Dołączył: 10.03.2012 Ostrzeżenie: (0%) ![]() ![]() |
Myślałeś żeby: a) Przepisać to pod PDO z przygotowanym zapytaniem i dla każdego rekordu wykonywać execute ![]() ? Nie myślałem, bo jak już wspomniałem na wstępie programowaniem zajmuję się z od czasu do czasu. Mam teraz konkretny problem do rozwiązania i utknąłem na powyższym etapie. Może ktoś bardziej doświadczony pomoże mi wyjść na prostą. A wracając do mojego kodu to pojawił się też kolejny nieoczekiwany problem z poniższym fragmentem:
Chciałbym wykluczyć z importu pierwszy wiersz zawierający nagłówki kolumn i ta część kodu nie realizuje zakładanego celu. Próbuję to poprawić na różne sposoby ale nie wychodzi. |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) ![]() ![]() |
Ale przecież pierwszy wiersz wyklcza warunek if($row == 0), to co następuje w bloku else to przetwarzanie właściwych danych.
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 60 Pomógł: 0 Dołączył: 10.03.2012 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) ![]() ![]() |
Straszny misz-masz, jednocześnie wyświetlasz i dodajesz do bazy, co zdecydowanie utrudnia zrozumienie tego kodu. Tak naprawdę do kodu, którego zadaniem jest wyświetlić dane z pliku csv wystarczy dopisać 9 linijek (z uwzględnieniem nawiasów zamykających), aby te dane jednocześnie dodawać do bazy danych. Zastanowiłbym się jednak nad odseparowaniem tych dwóch funkcjonalności. Niestety w tej chwili skrypt nie ma prawa działać prawidłowo, bo w miejscu, w którym generujesz zapytanie SQL nie masz dostępu do informacji o nazwach poszczególnych kolumn tabeli w bazie danych - tablica $data jest tablicą jednowymiarową i zawiera dane pochodzące z aktualnie przetwarzanego wiersza pliku csv, Ty tymczasem używasz jej jako tablicy dwuwymiarowej (gdzieś tam w kodzie masz $data[0][0]). Proponowałbym najpierw wykonać import danych, tzn. przepisać dane z pliku do bazy danych, a później wyświetlić dane, ale już "te" pobrane z bazy. Żeby nie "zarżnąć" skryptu warto skorzystać z zapytania MULTI-INSERT i wykonywać je co np. 50 rekordów (to ze wzglądów na ograniczenia MULTI-INSERTA).
|
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 1 590 Pomógł: 185 Dołączył: 19.04.2006 Skąd: Gdańsk Ostrzeżenie: (0%) ![]() ![]() |
Najlepiej się nie rozdrabniać i użyć LOAD DATA INFILE http://dev.mysql.com/doc/refman/5.1/en/load-data.html - od razu wrzuca do bazy cały plik lub jak kto woli, robi tabelę z pliku.
Jeśli jest taka potrzeba (a zazwyczaj jest), to plik najpierw należy sparsować i dokonać w nim odpowiednich zmian (by np. liczba kolumn była zawsze identyczna). Dopiero przygotowany i zwalidowany plik wrzucać do bazy - tak jest prościej i szybciej. Inaczej nie unikniesz problemów z plikami csv gdyż niektóre programy (typu excel choćby) robią w nich niezły burdel. No i możesz obejrzeć przygotowany plik, czy odpowiada strukturze tabeli w bazie. Ten post edytował Pilsener 12.03.2012, 01:24:13 |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 60 Pomógł: 0 Dołączył: 10.03.2012 Ostrzeżenie: (0%) ![]() ![]() |
Straszny misz-masz, jednocześnie wyświetlasz i dodajesz do bazy, co zdecydowanie utrudnia zrozumienie tego kodu. Tak naprawdę do kodu, którego zadaniem jest wyświetlić dane z pliku csv wystarczy dopisać 9 linijek (z uwzględnieniem nawiasów zamykających), aby te dane jednocześnie dodawać do bazy danych. Zastanowiłbym się jednak nad odseparowaniem tych dwóch funkcjonalności. Niestety w tej chwili skrypt nie ma prawa działać prawidłowo, bo w miejscu, w którym generujesz zapytanie SQL nie masz dostępu do informacji o nazwach poszczególnych kolumn tabeli w bazie danych - tablica $data jest tablicą jednowymiarową i zawiera dane pochodzące z aktualnie przetwarzanego wiersza pliku csv, Ty tymczasem używasz jej jako tablicy dwuwymiarowej (gdzieś tam w kodzie masz $data[0][0]). Proponowałbym najpierw wykonać import danych, tzn. przepisać dane z pliku do bazy danych, a później wyświetlić dane, ale już "te" pobrane z bazy. Żeby nie "zarżnąć" skryptu warto skorzystać z zapytania MULTI-INSERT i wykonywać je co np. 50 rekordów (to ze wzglądów na ograniczenia MULTI-INSERTA). Dzięki za uwagi, ale potrzebuję poprawnego fragmentu kodu - jak utworzyć tablicę $data dwuwymiarową, by później dostać się do konkretnych pól w odpowiednich wierszach ?. Ok - rozwiązałem problem innym sposobem. Szkoda, że nie doczekałem się jakiejś konkretnej pomocy ze strony tego forum. Dzięki za wszelkie chęci ![]() |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 21.06.2025 - 04:27 |