Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> WSTAWIANIE REKORDU Z PLIKU CSV, jak wstawić by się NIE duplikowały rekordy
grzesio
post
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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
nospor
post
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

Go to the top of the page
+Quote Post
alegorn
post
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.
Go to the top of the page
+Quote Post
grzesio
post
Post #4





Grupa: Zarejestrowani
Postów: 42
Pomógł: 0
Dołączył: 24.12.2003
Skąd: Wisła

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


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,.....





--------------------
"nie ma głupich pytań są tylko głupie odpowiedzi" -babcia Wladzia
a jednak slonce swieci dla wszystkich
Go to the top of the page
+Quote Post

Closed TopicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 16:15