Forumi


Povratak   PC Ekspert Forum > Računala > Software > Web dizajn, programiranje i ostalo
Ime
Lozinka

Odgovori
 
Uređivanje
Staro 25.02.2015., 22:09   #1
Burko
Osobni opis - pitaj me
Moj komp
 
Burko's Avatar
 
Datum registracije: Jul 2008
Lokacija: Zagreb
Postovi: 2,313
Load CSV-a u Mysql

Pozdrav dobri ljudi, nadam se pomoci .

dakle, zadatak kao takav nebi smio biti tezak. pogledas koliki je CSV, napravis neku formu koja sibne csv file preko POSTa, otvoris file, PHP fino zna gdje je kraj jer je pametan i zna baratati sa CSV-om, stavis u uvjet da je "," fino ga odvaja u recimo varijablu/e koje onda insertam u tablicu u odreden row prema odredenoj varijabli (znam da se ovo i moglo jednostavnije srediti preko indexa, sada nevazno).

no! sto ako (a ja imam taj prekrasan slucaj) je unutar jednog polja unutar samog CSV filea vise unosa koji su odvojeni sa zarezom - ,? naravno, svako polje ima ispred " i na kraju " sto oznacava da je to jedna vrijednost, ali meni sami uvjet fgetcsv razbija samo na - , .


ikakve ideje gdje i kako napraviti dodatnu provjeru, posto nisam na ti sa svim mogucnostima PHP-a? lako se ja prilagodim svemu i skuzim skoro sve kako i zasto radi, ali ovo me pati cijeli dan..........


ako nije skroz jasno, slika govori tisucu rijeci (ovo je primjera radi):
Attached Thumbnails
Click image for larger version

Name:	lala.jpg‎
Views:	295
Size:	30.6 kB
ID:	14597  
__________________
Hey love crusader, I want to be your space invader. For you I will descend the deepest moon crater. I is most stronger than darth vapor.
Obey me, I is your new dictator. For you is Venus, I am Mars. With you I is more richer than all the czars. Make a wishes on a shooting stars, then for you I will play on my cosmic guitars!

Burko je offline   Reply With Quote
Staro 25.02.2015., 22:19   #2
sinisa1989
Bazinga
Moj komp
 
sinisa1989's Avatar
 
Datum registracije: Nov 2007
Lokacija: Križevci
Postovi: 3,876
Ne znam kako izgleda csv, ali zar ne možeš promijeniti delimiter, pa da ti ne razlomi "polje" mejlova u više redova?
__________________
The best place to hide a dead body
is page 2 of Google search results.
sinisa1989 je offline   Reply With Quote
Oglasni prostor
Oglas
 
Oglas
Staro 25.02.2015., 22:27   #3
Burko
Osobni opis - pitaj me
Moj komp
 
Burko's Avatar
 
Datum registracije: Jul 2008
Lokacija: Zagreb
Postovi: 2,313
mogu ga promjeniti, ali meni treba i , i "". zapravo se sada opet igram malo ispocetka, pa ce mi malo echo raditi kako mu dam koji red vise.......
__________________
Hey love crusader, I want to be your space invader. For you I will descend the deepest moon crater. I is most stronger than darth vapor.
Obey me, I is your new dictator. For you is Venus, I am Mars. With you I is more richer than all the czars. Make a wishes on a shooting stars, then for you I will play on my cosmic guitars!

Burko je offline   Reply With Quote
Staro 25.02.2015., 22:34   #4
sinisa1989
Bazinga
Moj komp
 
sinisa1989's Avatar
 
Datum registracije: Nov 2007
Lokacija: Križevci
Postovi: 3,876
Jel si razmišljao razlomiš taj specifičan string po " delimiteru i strpaš to u polje - explode funkcija? Ubiješ nepotrebne vrijednosti u tom polju (zarez i prazan string) i imaš polje e-mail adresa. To ti ne pomaže?
__________________
The best place to hide a dead body
is page 2 of Google search results.
sinisa1989 je offline   Reply With Quote
Staro 25.02.2015., 23:08   #5
Forace
Premium
Moj komp
 
Datum registracije: Jul 2012
Lokacija: Petrinja
Postovi: 1,604
Evo dva algoritma za parsiranje:

1. pripremiti polja sa više vrijednosti - znači ako je unutar "XXX,AAA,BBB" pretvori u "xxx;AAA;BBB" - znači promjena delimitera da sene tuče sa zarezom iz csv.a
2. izbaciti nepotrebne znakove -> "

Poboljšani algoritam:

Svaki "," (navodnik zarez navodnik) zamijeniti sa ; (točka-zarez) te početak svakog retka i kraj svakog retka sa praznim stringom. Na taj način dobivamo novi csv sa novim delimiterom ;

Sad ovisi još šta treba napravit sa mejlovima koji su separirani sa zarezom.

Obično pisanje parsera, sam je pitanje koji je najbolji algoritam .
Forace je offline   Reply With Quote
Staro 26.02.2015., 09:46   #6
zwer
crnjo
Moj komp
 
zwer's Avatar
 
Datum registracije: Mar 2003
Lokacija: Zagreb
Postovi: 1,893
Ako sam ja dobro shvatio, ovo mozes slozit ovako, pseudokodom:

foreachas svaki red CSV-a i loadas ga u array
--onda isparsas polje email u kojem su emailovi odvojeni zarezom i ako ih ima vise, pretvoris ih u array explode-om
--foreachas svaki email u tom arrayu
----generiras SQL naredbu za insert u bazu s tim
--endfor
endfor

HTH
__________________
sound powered by B&W/Denon

Zadnje izmijenjeno od: zwer. 26.02.2015. u 10:07.
zwer je offline   Reply With Quote
Staro 26.02.2015., 11:35   #7
Burko
Osobni opis - pitaj me
Moj komp
 
Burko's Avatar
 
Datum registracije: Jul 2008
Lokacija: Zagreb
Postovi: 2,313
jok. na kraju je fgetcsv odradio posao, mene je zezao ogroman query koji sam jutros prepravljao nekih tri sata jer su cudesa dodatno se pojavila kao problemi....... mah, kada nisam jako dugo bio u ovome, pa mi je sve WTF - zasto ne radi.......

iako mi je jedna zanimljiva anomalija se pojavila, preskace mi po jedan red, jos ne vidim gdje i zasto. kad usporedim kolicinu redova koja je strpana u tablicu i kolicinu redova u original csv-u, ispada da ih fali........

ima tko kakvu ideju zasto?

svakako hvala na pomoci!!!!!
__________________
Hey love crusader, I want to be your space invader. For you I will descend the deepest moon crater. I is most stronger than darth vapor.
Obey me, I is your new dictator. For you is Venus, I am Mars. With you I is more richer than all the czars. Make a wishes on a shooting stars, then for you I will play on my cosmic guitars!

Burko je offline   Reply With Quote
Staro 13.04.2015., 21:36   #8
Burko
Osobni opis - pitaj me
Moj komp
 
Burko's Avatar
 
Datum registracije: Jul 2008
Lokacija: Zagreb
Postovi: 2,313
ok, daaaaleko sam dogurao sa ovim projektom. ono postavljeno na pocetku je sada neka daleka proslost jer sam unazad mjesec i pol (cca) prosao poprilicno toga sto mi je projekt zahjevao. plus, ono na pocetku je poprilicno zeleno pitanje bilo, jer sam se tek upustio u to.

no, naletio sam na drugi problem, pa ako ima koji pametan savjet.

naime, parsanje ide po imenima headera samog CSV filea. taj csv file nije svaki put "istog" oblika, no imena headera jesu uvijek ista (ali njihova pozicija nije, tako da ja lovim index iz arraya headera (prvog reda csv-a)), i to sve prolazi u najboljem redu svaki put.

naravno, pod uvjetom da mi se imena headera - ne mjenjaju. ali to tako i mora funkcionirati zbog daljnjeg rada sa bazom, jer iscitavam u drugom dijelu, pa moram znati koji row pitam sta . nevermind, doslovce nevazno to.

naletio sam na jedan blesav problem. export csv filea iz programa mi je iz meni jos nepoznatog razloga nabacio nekakav encoding nad samo prvim headerom po redu (u mom slucaju je konkretno rijec o headeru "first name").

sad, ja usporedujem procitano po prvom redu sa onim vec predvidenim upravo radi pozicije indexa, zbog preleta svih drugih redova. tj, ja usporedujem u mom slucaju case "first name" sa npr $rowCSV[i] gdje mi je i -> broj.

i meni preleti preko svih jer je meni ocito samo taj header napravljen u necemu sto nije UTF-8. i ne uhvati ga, tj ne nade first name uopce. pa sam isao malo kopati, ispadne da je u tom headeru sljedece: first name

ja kada napravim echo sa encodingom UTF-8 dobijem kako treba - first name. ali kada kroz funkciju radim usporedivanje - preskoci ga.

stoga, jel postoji nacin gdje cu ja prebaciti samo jedan (ili sve) rowove (headere) strikno i samo u UTF-8? ili samo taj jedan header?


ne znam jesam li bio dovoljno jasan . uglavnom, koliko sam citao, ocekuje se da je encoding samog CSV-a koji se loada kroz php u UTF-8, ali kod mene to ocito nije slucaj i trebao bi samo taj jedan "procitati" bas kao UTF-8.
__________________
Hey love crusader, I want to be your space invader. For you I will descend the deepest moon crater. I is most stronger than darth vapor.
Obey me, I is your new dictator. For you is Venus, I am Mars. With you I is more richer than all the czars. Make a wishes on a shooting stars, then for you I will play on my cosmic guitars!

Burko je offline   Reply With Quote
Staro 14.04.2015., 00:16   #9
Bubba
E Pluribus UNIX
Moj komp
 
Bubba's Avatar
 
Datum registracije: Oct 2002
Lokacija: M82
Postovi: 6,543
Moram priznat da nisam bas shvatio sto te zapravo muci (previse teksta za kasni sat), ali nesto mi nije jasno - ako imas jednu datoteku (CSV, ali nebitno u ovom slucaju), ona moze imati samo jedan encoding. Tako da, ako sam te dobro shvatio, tvoja teorija o tome da su odredjeni dijelovi datoteke u jednom a neki drugi u razlicitom encodingu jednostavno ne stoji i problem je negdje drugdje.

Mozda da sazmes problem u nekoliko recenica sa use caseom, jer evo, ni nakon drugog citanja mi nije bas najjasnije, cinjenica je da nisam Bog zna kako pametan, ali ono...
__________________
Programer
Rok od dva mjeseca u stvari znači četiri, ali nikako ispod šest.
Bubba je offline   Reply With Quote
Staro 14.04.2015., 00:48   #10
rodney
only fool, not a horse
Moj komp
 
rodney's Avatar
 
Datum registracije: Apr 2008
Lokacija: near zgb
Postovi: 1,276
http://en.wikipedia.org/wiki/Byte_order_mark#UTF-8

Taj prvi znak ti je BOM.
Po njemu znaš da je file UTF-8.
__________________
"I intend to live forever. So far, so good."

job security - example
rodney je offline   Reply With Quote
Oglasni prostor
Oglas
 
Oglas
Staro 14.04.2015., 08:26   #11
Burko
Osobni opis - pitaj me
Moj komp
 
Burko's Avatar
 
Datum registracije: Jul 2008
Lokacija: Zagreb
Postovi: 2,313
hvala obojici, ja sam lose napisao pa da pojednostavim.

prvi red su headeri u csv-u, na temelju njih uzimam indexe jer ne prebacujem sve u bazu (plus sto je csv varijabilan po broju headera). i sve sljaka osim sto kada pokusam po jednakosti uloviti index od case "first name" - meni ne nade nista, jer je taj header u encodingu UTF-8. ja sam malo krivo pretpostavio i napisao krivo pitanje, jer sam zabrijao da postoji nesto drugo osim cistog rezanja stringa (citaj dolje).

svi drugi headeri nemaju UTF-8, citam ih direkt kroz prvi red i nema .

opet, hvala obojici, pogotovo rodneyu!

rjeseno, prije switch case sam samo ubacio
Code:
// strip off BOM (UTF-8)
if (strpos($data, "\xef\xbb\xbf") !== FALSE) {
          $data = substr($data, 3);
      }
      // strip off BOM (LE UTF-16) 
      else if(strpos($data, "\xff\xfe") !== FALSE) {
        $data = substr($data, 2);
      }
      // strip off BOM (BE UTF-16) 
      else if(strpos($data, "\xfe\xff") !== FALSE) {
          $data = substr($data, 2);
      }
cime sam rjesio UTF-8 i UTF-16 za svaki slucaj. sada mi ovo ima itekako smisla jer sam ovako i mislio rjesiti problem, no kako rekoh, nadao sam se da sam php ima neki oblik funkcije automatskog micanja BOM-a, tj UTF-8 u mom slucaju.

rezime je da radi, hvala na vremenu!
__________________
Hey love crusader, I want to be your space invader. For you I will descend the deepest moon crater. I is most stronger than darth vapor.
Obey me, I is your new dictator. For you is Venus, I am Mars. With you I is more richer than all the czars. Make a wishes on a shooting stars, then for you I will play on my cosmic guitars!

Burko je offline   Reply With Quote
Staro 14.04.2015., 17:55   #12
rodney
only fool, not a horse
Moj komp
 
rodney's Avatar
 
Datum registracije: Apr 2008
Lokacija: near zgb
Postovi: 1,276
Citiraj:
Autor Burko Pregled postova
... sada mi ovo ima itekako smisla jer sam ovako i mislio rjesiti problem, no kako rekoh, nadao sam se da sam php ima neki oblik funkcije automatskog micanja BOM-a, tj UTF-8 u mom slucaju.

rezime je da radi, hvala na vremenu!
ahaha pa što ne reče.
Citiraj:
mb_internal_encoding('UTF-8');
Podesiš ovo u php-u i onda ti php automatski preskače BOM
Ali moraš bit siguran da dobivaš utf-8, inače bi moglo biti problema.
BOM ti inače služi kako bi mogao razlikovati encoding gdje nema posebnih znakova.
Npr ANSI je podskup od UTF-8, i onda ako imaš ansi file, kako bi znao da li želiš encoding
ovaj ili onaj, kad more biti oboje. Kad staviš BOM, nema dileme.
__________________
"I intend to live forever. So far, so good."

job security - example

Zadnje izmijenjeno od: rodney. 14.04.2015. u 17:58. Razlog: tipfeleri :D
rodney je offline   Reply With Quote
Staro 14.04.2015., 19:50   #13
Burko
Osobni opis - pitaj me
Moj komp
 
Burko's Avatar
 
Datum registracije: Jul 2008
Lokacija: Zagreb
Postovi: 2,313
Citiraj:
Autor rodney Pregled postova
Podesiš ovo u php-u i onda ti php automatski preskače BOM
Ali moraš bit siguran da dobivaš utf-8, inače bi moglo biti problema.
eh.... kako rekoh, prvi field jest, drugi nisu . da ne ubacujem internal_encoding umjesto ovog uvjetovanja, da li bi jednako radilo?

posto opet kazem - samo prvi field headera ima UTF-8 encoding, drugi nemaju .
__________________
Hey love crusader, I want to be your space invader. For you I will descend the deepest moon crater. I is most stronger than darth vapor.
Obey me, I is your new dictator. For you is Venus, I am Mars. With you I is more richer than all the czars. Make a wishes on a shooting stars, then for you I will play on my cosmic guitars!

Burko je offline   Reply With Quote
Staro 14.04.2015., 20:55   #14
rodney
only fool, not a horse
Moj komp
 
rodney's Avatar
 
Datum registracije: Apr 2008
Lokacija: near zgb
Postovi: 1,276
Pa encoding se nejčešće odnosi na cijeli file.
Možeš imat u file-u više različitih encodinga, ali onda bi file morao čitat
kao binary, i znat, ili prepoznat koji dio kako čitat.
Ako ti ostala polja, retci, nisu utf-8, u kojem encodingu jesu?
__________________
"I intend to live forever. So far, so good."

job security - example
rodney je offline   Reply With Quote
Staro 14.04.2015., 21:48   #15
Burko
Osobni opis - pitaj me
Moj komp
 
Burko's Avatar
 
Datum registracije: Jul 2008
Lokacija: Zagreb
Postovi: 2,313
pojma nemam . rekao sam, kada napravim echo nad tim prvim cijelim redom (headeri), samo mi na prvom izbacuje ovo sto si upravo rekao da je BOM. sve ostalo mi regularno izbacuje bez ikakvog BOM-a.

tj, kada otvorim csv u libreu, ako ostavim encoding UTF-8, onda mi samo promjeni taj prvi field, makne xef\xbb\xbf. ako stavim bilo koji drugi encoding - prikazuje znakove. bit ce da je samo prvi field u encodingu, sve ostalo u pojma nemam cemu .

mozda bude jasnije preko slika:




zato pitam, da li ce mi mb_internal_encoding('UTF-8') sljakati samo nad fieldovima koji jesu u UTF-8, dok druge zanemariti ili ce i njih krenuti prebacivati?

ponavljam opet, meni sljaka ovako kako je napravljeno jer mi svaki put jel, provjeri sto se nalazi na pocetku stringa i ako jest ovo u hex zapisu - sreze te znakove .
__________________
Hey love crusader, I want to be your space invader. For you I will descend the deepest moon crater. I is most stronger than darth vapor.
Obey me, I is your new dictator. For you is Venus, I am Mars. With you I is more richer than all the czars. Make a wishes on a shooting stars, then for you I will play on my cosmic guitars!

Burko je offline   Reply With Quote
Staro 15.04.2015., 07:52   #16
rodney
only fool, not a horse
Moj komp
 
rodney's Avatar
 
Datum registracije: Apr 2008
Lokacija: near zgb
Postovi: 1,276
Citiraj:
Autor Burko Pregled postova
pojma nemam . rekao sam, kada napravim echo nad tim prvim cijelim redom (headeri), samo mi na prvom izbacuje ovo sto si upravo rekao da je BOM. sve ostalo mi regularno izbacuje bez ikakvog BOM-a.

tj, kada otvorim csv u libreu, ako ostavim encoding UTF-8, onda mi samo promjeni taj prvi field, makne xef\xbb\xbf. ako stavim bilo koji drugi encoding - prikazuje znakove. bit ce da je samo prvi field u encodingu, sve ostalo u pojma nemam cemu .
ok, malo sam pogledao, ovaj internal encoding nije za to, on se odnosi na
encoding same php skripte. Znači možeš ostavit ovaj svoj kod.
Unatoč tome, fali ti poprilično razumjevanja o tome što je encoding, svaki
znak ti "ima encoding", to je jednostavno hashmap koji ti kaže koji niz
bytova pretvoriti u koje slovo. Kad ti kažeš import encoding utf-8, libre čita
cijeli file kao utf-8. Ne vjerujem da ijedan text editor može raditi sa više
encodinga u jednom file-u. A ako bi otvarao s text editorom takav file, kad
bi izabrao encoding, onaj dio fajla koji je u tom encodingu bi bio prikazan
dobro, a ostatak u onim čudnim znakovima, sigurno si to negdje već vidio...
http://www.joelonsoftware.com/articles/Unicode.html
Tu imaš neloš članak koji ti opisuje što to zapravo je.
__________________
"I intend to live forever. So far, so good."

job security - example
rodney je offline   Reply With Quote
Staro 15.04.2015., 09:27   #17
Burko
Osobni opis - pitaj me
Moj komp
 
Burko's Avatar
 
Datum registracije: Jul 2008
Lokacija: Zagreb
Postovi: 2,313
mmm.... jasno, iako moram pitati da li mi je jasno kako treba .

kada stavim encoding u libreu npr UTF-8, svaki niz koji se procita se prikazuje u odredenom karakteru. u ovom slucaju zato meni prolazi (ako sam dobro skuzio, opet - trazim potvrdu) jer prvi field jest u UTF-8 i samim time mi prikaze samo first name, dok nad svim drugima isti UTF-8 encoding odradi tako sto prikaze - ono sto jest?

tj, takoder odradi encoding u UTF-8, ali je sam zapis jednak kao da ima BOM. iako je stavljen nad samo prvim fieldom?

to generalno ne razumijem, zasto je samo prvi field drugaciji od drugih?
__________________
Hey love crusader, I want to be your space invader. For you I will descend the deepest moon crater. I is most stronger than darth vapor.
Obey me, I is your new dictator. For you is Venus, I am Mars. With you I is more richer than all the czars. Make a wishes on a shooting stars, then for you I will play on my cosmic guitars!

Burko je offline   Reply With Quote
Staro 15.04.2015., 21:16   #18
rodney
only fool, not a horse
Moj komp
 
rodney's Avatar
 
Datum registracije: Apr 2008
Lokacija: near zgb
Postovi: 1,276
BOM se stavi samo kao prvi znak u fajlu. Jednom, za čitav file.
File ima niz znakova. Hebe mu se jel to tebi fileld bla bla delimiter žnj klj itd.
Kad počne čitat file, vidi odmah na prvom mjestu BOM, i aha, file je encodiran u utf-8.
__________________
"I intend to live forever. So far, so good."

job security - example
rodney je offline   Reply With Quote
Staro 15.04.2015., 23:55   #19
Burko
Osobni opis - pitaj me
Moj komp
 
Burko's Avatar
 
Datum registracije: Jul 2008
Lokacija: Zagreb
Postovi: 2,313
ajd.... nisam to znao, pogotovo jer dobivam svako malo export u obliku doticnog csv-a, te do sada nije bilo BOM-a :S.

pa me to malo zbunilo, ali ako je tako kako kazes - ok!

thnx na pomoci i pojasnjenju, zaista .
__________________
Hey love crusader, I want to be your space invader. For you I will descend the deepest moon crater. I is most stronger than darth vapor.
Obey me, I is your new dictator. For you is Venus, I am Mars. With you I is more richer than all the czars. Make a wishes on a shooting stars, then for you I will play on my cosmic guitars!

Burko je offline   Reply With Quote
Staro 16.04.2015., 18:46   #20
rodney
only fool, not a horse
Moj komp
 
rodney's Avatar
 
Datum registracije: Apr 2008
Lokacija: near zgb
Postovi: 1,276
np
__________________
"I intend to live forever. So far, so good."

job security - example
rodney je offline   Reply With Quote
Oglasni prostor
Oglas
 
Oglas
Odgovori



Pravila postanja
Vi ne možete otvarati nove teme
Vi ne možete pisati odgovore
Vi ne možete uploadati priloge
Vi ne možete uređivati svoje poruke

BB code je Uključeno
Smajlići su Uključeno
[IMG] kod je Uključeno
HTML je Isključeno

Idi na