Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Import i sumowanie istniejących CSV
banki
post
Post #1





Grupa: Zarejestrowani
Postów: 109
Pomógł: 1
Dołączył: 23.11.2007

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


Witam wszystkich,

mam problem z importem pliku CSV do bazy danych. Oczywiście zwykłe importowanie działa, ale nie zadowala mnie wynik tego importu.

Załóżmy że mam plik CSV wyglądający tak:
3504,72.00,011179239474,U23947,"nazwa 1"
3506,72.00,011179238910,U23891,"nazwa 2"
3508,72.00,011179238828,U23882,"nazwa 3"
3506,22.00,011179238910,U23891,"nazwa 2"

Jak widać 2 i 4 wiersz jest taki sam, różni się jedynie drugą kolumną. W moim kodzie importuje się jednak tylko jeden wiersz, ten, który jest wyżej. W tym wypadku 4 wiersz jest pomijany. Zwracane jest coś takiego:
3504,72.00,011179239474,U23947,"nazwa 1"
3506,72.00,011179238910,U23891,"nazwa 2"
3508,72.00,011179238828,U23882,"nazwa 3"

Efekt jaki chcę osiągnąć to:
3504,72.00,011179239474,U23947,"nazwa 1"
3506,94.00,011179238910,U23891,"nazwa 2"
3508,72.00,011179238828,U23882,"nazwa 3"

Czyli wartość np. z 2 kolumny się sumowała. 1 kolumna jest unikalna i niepowtarzalna, więc rekordy, które mają tą samą liczbę w kolumnie 1 powinny sumować wynik z kolumny 2. Nie wiem czy jasno wytłumaczyłem.

Do tej pory używałem do importu takiego kodu:
  1. <?php
  2. include 'dbConfig.php';
  3. if(isset($_POST['importSubmit'])){
  4. $csvMimes = array('text/x-comma-separated-values', 'text/comma-separated-values', 'application/octet-stream', 'application/vnd.ms-excel', 'application/x-csv', 'text/x-csv', 'text/csv', 'application/csv', 'application/excel', 'application/vnd.msexcel', 'text/plain');
  5. if(!empty($_FILES['file']['name']) && in_array($_FILES['file']['type'],$csvMimes)){
  6. if(is_uploaded_file($_FILES['file']['tmp_name'])){
  7.  
  8. $csvFile = fopen($_FILES['file']['tmp_name'], 'r');
  9. fgetcsv($csvFile);
  10. while(($line = fgetcsv($csvFile)) !== FALSE){
  11. $db->query("INSERT INTO produkty (numer, ilosc, ean, kod1, nazwa) VALUES ('".$line[0]."','".$line[1]."','".$line[2]."','".$line[3]."','".$line[4]."','".$line[5]."')");
  12. }
  13. fclose($csvFile);
  14. $qstring = '?status=sukces';
  15. }else{
  16. $qstring = '?status=error';
  17. }
  18. }else{
  19. $qstring = '?status=nieprawidlowy_plik';
  20. }
  21. }
  22. header("Location: index.php".$qstring);
  23. ?>



Z góry dzięki za jakiekolwiek podpowiedzi.

Ten post edytował banki 26.06.2018, 22:56:57
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
banki
post
Post #2





Grupa: Zarejestrowani
Postów: 109
Pomógł: 1
Dołączył: 23.11.2007

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


u mnie zadziałało to:

ON DUPLICATE KEY UPDATE ilosc = ilosc+$line[1]

z VALUES i z Coalesce() nic się nie dzieje

Pojawił się przy tym kolejny problem. Problemem jest jeśli plik CSV jest oddzielany średnikiem ; a nie przecinkiem.

Zmieniając fgetcsv($csvFile) na fgetcsv($csvFile, 0, ';') aby rozdzielało po średnikach, wali się wszystko. Nie wczytuje w ogóle do bazy nic.

Usuwając ON DUPLICATE KEY UPDATE ładuje się plik ze średnikami. Wygląda jakby ON DUPLICATE KEY UPDATE kolidował ze średnikami ... możliwe?
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 14.05.2026 - 08:42