![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 42 Pomógł: 0 Dołączył: 24.12.2003 Skąd: Wisła Ostrzeżenie: (0%) ![]() ![]() |
Mam taki mały problem
nie wiem jak wstawić rekordy (500 - 20 000 rekordow) z pliku CSV, tak aby rekordy były unikalne nie powtarzały się, tzn gdy wczytam 2 razy ten sam plik rekordy nie dopisywały się ponownie. 1. istnieje pole id (autoincrement) identyfikujace dany rekord, ======================= pobieram dane z pliku w ten sposób: if (($handle = fopen('c:\przelewy\rok_2012.csv', "r")) !== FALSE) { while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) { $num = count($data); echo "<p> $num fields in line $row: <br /></p>\n"; $row++; ....................... INSERT INTO `wplaty_CSV_test` ( `data` , `wplacajacy` , `konto` , `tytul_wplaty` , `kwota` ,`saldo` , `wpisane` ) VALUES ('2012-05-15','Pan Jan','45654654676888888', 'OPŁATA ', '9.20','6.66', 'NIE' ) ....................... =========================== czy może lepiej: LOAD DATA LOCAL INFILE '<file name>' INTO TABLE <table> ============================ z powodu pola autoincrement mam problem z tym: INSERT INTO tmp SELECT DISTINCT * FROM wplaty_CSV_test =============================== tabela prezentuje się tak: CREATE TABLE IF NOT EXISTS `wplaty_csv` ( `nr` int(11) NOT NULL auto_increment, `data` date NOT NULL, `wplacajacy` varchar(170) NOT NULL, `konto` varchar(28) NOT NULL, `tytul_wplaty` varchar(400) NOT NULL, `kwota` float NOT NULL, `saldo` float NOT NULL, `wpisane` varchar(3) NOT NULL default 'NIE', PRIMARY KEY (`nr`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 ; Jak wczytywać pliki CSV szybko sprawnie i skutecznie ? Dziękuję z góry za pomoc G. Ten post edytował grzesio 15.05.2012, 08:48:00 -------------------- "nie ma głupich pytań są tylko głupie odpowiedzi" -babcia Wladzia
a jednak slonce swieci dla wszystkich |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
1) Nie krzycz
2) Popraw BBCODE Jak nie poprawisz obu rzeczy temat zostanie zamknięty -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 341 Pomógł: 40 Dołączył: 23.06.2009 Ostrzeżenie: (0%) ![]() ![]() |
1) zdefiniuj unikalność rekordu (mam nadzieje ze możesz to osiągnąć inaczej niż przez auto inc)
2) załóż klucz uniq na pola zdefiniowane w pkt 1 3) w imporcie recznym uzywaj insert ignore lub opcje on duplicate key, na zignorowanie, lub przechwycenie duplikatow 4) load data bedzie najszybsze, jednak chyba kolumny w csv powinny odpowiadac strukturze w tabeli (tzn mozesz wybrac do ktorych kolumn w tabeli, ale chyba nie da sie pominac kolumny z csv) 4a) jesli musisz pominac jakies kolumny - uzyj kolumn w tabeli zdefiniowanych jako: char(0) 5) jesli juz decydujesz sie na reczne dodawanie z poziomu php - wysylaj wieksze partie, nie po jednym rekordzie : VALUES (...),(...),(...) 6) pamietaj o kodowaniu. j. |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 42 Pomógł: 0 Dołączył: 24.12.2003 Skąd: Wisła Ostrzeżenie: (0%) ![]() ![]() |
1) zdefiniuj unikalność rekordu (mam nadzieje ze możesz to osiągnąć inaczej niż przez auto inc) 2) załóż klucz uniq na pola zdefiniowane w pkt 1 3) w imporcie recznym uzywaj insert ignore lub opcje on duplicate key, na zignorowanie, lub przechwycenie duplikatow 4) load data bedzie najszybsze, jednak chyba kolumny w csv powinny odpowiadac strukturze w tabeli (tzn mozesz wybrac do ktorych kolumn w tabeli, ale chyba nie da sie pominac kolumny z csv) 4a) jesli musisz pominac jakies kolumny - uzyj kolumn w tabeli zdefiniowanych jako: char(0) 5) jesli juz decydujesz sie na reczne dodawanie z poziomu php - wysylaj wieksze partie, nie po jednym rekordzie : VALUES (...),(...),(...) 6) pamietaj o kodowaniu. j. Nie wnikam w szczegóły poprawnosci mysql ale poniższe działania nie dzialaly: alter table `wplaty_CSV_test` add constraint unique( `data`, `wplacajacy`, `konto`, `tytul_wplaty`) alter table `wplaty_CSV_test` add constraint unique( `kwota`) musialem zrobić tak: DROP TABLE `wplaty_CSV_test` alter table `wplaty_CSV_test` add constraint unique( `data`, `wplacajacy`, `konto`, `tytul_wplaty`, `kwota`) i ruszyło dziękuję za pomoc unique łaczy wszystkie pola jako jeden unique miałem problem z kwotą (o roznej wartosc) wplacanej tego samego dnia z tego samego konta lecz rozniacą się tylko kwota ALE JEST PROBLEM: - co bedzie jesli będą 2 wpłaty identyczne ? czyli 2 rekordy takie same chyba dodam jeszcze do unique stan konta,..... -------------------- "nie ma głupich pytań są tylko głupie odpowiedzi" -babcia Wladzia
a jednak slonce swieci dla wszystkich |
|
|
![]() ![]() |
![]() |
Aktualny czas: 21.08.2025 - 16:15 |