|
25.02.2015., 22:09 | #1 |
Osobni opis - pitaj me
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):
__________________
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! |
25.02.2015., 22:19 | #2 |
Bazinga
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. |
|
|
Oglas
|
|
25.02.2015., 22:27 | #3 |
Osobni opis - pitaj me
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! |
25.02.2015., 22:34 | #4 |
Bazinga
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. |
25.02.2015., 23:08 | #5 |
Premium
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 . |
26.02.2015., 09:46 | #6 |
crnjo
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. |
26.02.2015., 11:35 | #7 |
Osobni opis - pitaj me
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! |
13.04.2015., 21:36 | #8 |
Osobni opis - pitaj me
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! |
14.04.2015., 00:16 | #9 |
E Pluribus UNIX
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. |
14.04.2015., 00:48 | #10 |
only fool, not a horse
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. |
|
|
Oglas
|
|
14.04.2015., 08:26 | #11 |
Osobni opis - pitaj me
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); } 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! |
14.04.2015., 17:55 | #12 | ||
only fool, not a horse
Datum registracije: Apr 2008
Lokacija: near zgb
Postovi: 1,276
|
Citiraj:
Citiraj:
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. Zadnje izmijenjeno od: rodney. 14.04.2015. u 17:58. Razlog: tipfeleri :D |
||
14.04.2015., 19:50 | #13 | |
Osobni opis - pitaj me
Datum registracije: Jul 2008
Lokacija: Zagreb
Postovi: 2,313
|
Citiraj:
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! |
|
14.04.2015., 20:55 | #14 |
only fool, not a horse
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? |
14.04.2015., 21:48 | #15 |
Osobni opis - pitaj me
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! |
15.04.2015., 07:52 | #16 | |
only fool, not a horse
Datum registracije: Apr 2008
Lokacija: near zgb
Postovi: 1,276
|
Citiraj:
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. |
|
15.04.2015., 09:27 | #17 |
Osobni opis - pitaj me
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! |
15.04.2015., 21:16 | #18 |
only fool, not a horse
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. |
15.04.2015., 23:55 | #19 |
Osobni opis - pitaj me
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! |
16.04.2015., 18:46 | #20 |
only fool, not a horse
Datum registracije: Apr 2008
Lokacija: near zgb
Postovi: 1,276
|
np |
|
|
Oglas
|
|
|
|