Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: WSTAWIANIE REKORDU Z PLIKU CSV
Forum PHP.pl > Forum > Bazy danych > MySQL
grzesio
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.
nospor
1) Nie krzycz
2) Popraw BBCODE

Jak nie poprawisz obu rzeczy temat zostanie zamknięty
alegorn
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.
grzesio
Cytat(alegorn @ 15.05.2012, 11:07:50 ) *
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,.....



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.