Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Odczyt danych z arkusza kalkulacyjnego .csv
Forum PHP.pl > Forum > PHP
kirkor0
Mam plik arkusza kalkulacyjnego .csv, który zawiera listę kodów. Są one ułożone jedynie w kolumnie A kolejno w wierszach 1, 2, 3 itp. Jest ich łącznie 10 000. Plik zajmuje 100KB.

Wszystkie kody muszę wrzucic do bazy. Wiem, że mogę zrobic to przez textarea albo poprostu skopiowac zawartosc do txt i go uploadowac.
Kody jednak zawsze dostaję w pliku .csv i to w właśnie w takim formacie dane chcę umieszczac w serwerze.

Nie mam zielonego pojęcia jak się do tego zabrac i czy wogóle to jest możliwe. Wytłumaczcie mi jak lamerowi, jak, z czym, kiedy, po co to się je.
nospor
Cytat
albo poprostu skopiowac zawartosc do txt i go uploadowac.

Ale przeciez csv to tak naprawe txt, tylko ciut sformatowany, wiec poco kopiowac jeden plik do drugiego? bez sensu winksmiley.jpg

Mozesz takie dane bezposrednio z mysql wrzucac:
http://dev.mysql.com/doc/refman/5.0/en/load-data.html
Balon
powiem Ci ze sam probowalem cos takiego napisac

  1. <?php
  2. /**
  3.  * Funkcja konwertujaca pliki csv
  4.  * z ocenami do tablicy
  5.  *
  6.  * @param string $file
  7.  * @return array
  8.  */
  9. function csv2array( $file )
  10. {
  11. $gRows = array();
  12. $rows = explode( "n", $file );
  13. $i=0;
  14.  
  15. foreach( $rows as $row )
  16. {
  17. if( !$i++ || !strlen( trim( $line = $row ) ) ) continue;
  18. $line = explode( ';', $line );
  19.  
  20. $gRows[$i-2] = array( 
  21. 'login' => array_shift( $line ), 
  22. 'nazwisko' => array_shift( $line ), 
  23. 'dane'  => array_chunk( $line, 5 ) 
  24. );
  25. }  
  26. array_shift( $gRows );
  27.  
  28. return $gRows;
  29. }
  30.  
  31. function array2query( $arr )
  32. {
  33. global $db;
  34. foreach( $arr as $ar )
  35. {
  36. #$db->GetAll( 'SELECT * FROM oceny WHERE ')
  37. $db->Execute( 'DELETE FROM oceny WHERE login = "'.$ar['login'].'"' );
  38. foreach( $ar['dane'] as $dane )
  39. {
  40. $db->Execute( 'INSERT INTO oceny SET login = "'.$ar['login'].'", cz1 = "'.$dane[0].'", cz2 = "'.$dane[1].'", cz3 = "'.$dane[2].'", calosc = "'.$dane[3].'", data = "'.$dane[4].'"' );
  41. }
  42. }
  43. return true;
  44. }
  45. ?>


W ten sposób przetwarzalem i wrzucalem do bazy takie pliki.
Kod
login;nazwisko;cz1;cz2;cz3;calosc;data;cz1;cz2;cz3;calosc;data;cz1;cz2;cz3;calos
c;data;cz1;cz2;cz3;calosc;data;cz1;cz2;cz3;calosc;data;cz1;cz2;cz3;calosc;data;cz
1;cz2;cz3;calosc;data;cz1;cz2;cz3;calosc;data;cz1;cz2;cz3;calosc;data;cz1;cz2;cz3
;calosc;data;cz1;cz2;cz3;calosc;data
mojlog;adamski;22;11;30;63;12-05-2007;22;11;30;63;14-07-2007;22;11;30;63;12-08-2007;22;11;30;63;12-05-2007;22;11;30;63;12-05-2007;22;11;30;63;12-05-2007;22;11;30;63;12-05-2007;22;11;30;63;12-05-2007;22;11;30;63;12-05-2007;22;11;30;63;12-05-2007;22;11;30;63;12-05-2007
mojlog;adamski;22;11;30;63;12-05-2007;22;11;30;63;14-07-2007;22;11;30;63;12-08-2007;22;11;30;63;12-05-2007;22;11;30;63;12-05-2007;22;11;30;63;12-05-2007;22;11;30;63;12-05-2007;22;11;30;63;12-05-2007;22;11;30;63;12-05-2007;22;11;30;63;12-05-2007;22;11;30;63;12-05-2007
mojlog;adamski;22;11;30;63;12-05-2007;22;11;30;63;14-07-2007;22;11;30;63;12-08-2007;22;11;30;63;12-05-2007;22;11;30;63;12-05-2007;22;11;30;63;12-05-2007;22;11;30;63;12-05-2007;22;11;30;63;12-05-2007;22;11;30;63;12-05-2007;22;11;30;63;12-05-2007;22;11;30;63;12-05-2007
mojlog;adamski;22;11;30;63;12-05-2007;22;11;30;63;14-07-2007;22;11;30;63;12-08-2007;22;11;30;63;12-05-2007;22;11;30;63;12-05-2007;22;11;30;63;12-05-2007;22;11;30;63;12-05-2007;22;11;30;63;12-05-2007;22;11;30;63;12-05-2007;22;11;30;63;12-05-2007;22;11;30;63;12-05-2007
kirkor0
nospor dzięki, spoko. Nie jestem najlepszy z angielskiego i nie mogę czegoś sie dopatrzec.

Najlepiej opiszę o co mi chodzi.

Mam plik plik.csv. Kody są ułożone każdy w nowej lini:
  1. 12345678
  2. KD6APQOD
  3. FDHY94T1
  4. (itd.)


Mam też tabelę kody:
  1. kod char(8),
  2. pole1 int,
  3. data_dodania datetime.


I teraz chcę wrzucic każdy kod jako nowy rekord, a
pole pole1 uzupelnic jakas wartoscia, natomiast
pole data_dodania obecną datą w danej chwili.

Nie mogę doszuka w manualu jak to zrobic. Nakieruj mnie.

A i dodam, że na serwerze mam MySQL 4.0.27.
Prph
Jest funkcja wbudowana w php.

  1. <?php
  2. $aRecord = fgetcsv($this->_rCSV, 512, ',');
  3. ?>


Pierwszy parametr to uchwyt do pliku, dlugi to dlugosc linii, trzeci to separator pola.
Zwraca tablice z polami z danej linii.

Pozdrawiam, Adrian.
kirkor0
OK. Jednak bardziej by mi odpowiadał sposób nospora.
Jednak nadal nie wiem jak zrobic to w moim przypadku.

nospor, POMÓŻ!!!

EDIT:
Przed chwilą zauważyłem, że plik, z którego dane są ładowane do MySQL przez LOAD DATA INFILE musi byc na serwerze, na ktorym zainstalowana jest baza.
Ja chce pliki wrzucac przez przegladarke.
To wogóle możliwe?
nospor
Cytat
Ja chce pliki wrzucac przez przegladarke.
Aaaa, jak tak to chiba nie sad.gif
Myslalem ze dostajesz do reki te pliki
kirkor0
Tzn. dostaje do reki. Ale caly system jest na wykupionym serwerze.

Czyli wychodzi na to, ze bede musial odczytac wszystkie kody i wrzucic zapytaniem.
A może wiecie ile można maksymalnie dodac rekordów jednym INSERT'em?
Bo kodów do mam 10 000 w jednym pliku! tongue.gif

EDIT:
Właśnie zauważyłem, że błąd leżał po innej stronie. Spokojnie dodało 10 000 rekordów.
Problem rozwiązany.
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.