Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Ucitavanje fajla sa razlicitim redovima SQL*Loaderom

[es] :: Oracle :: Ucitavanje fajla sa razlicitim redovima SQL*Loaderom

[ Pregleda: 3379 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

dacarica
dalibor lukić
bg

Član broj: 14845
Poruke: 56
*.alphabankserbia.com.



+8 Profil

icon Ucitavanje fajla sa razlicitim redovima SQL*Loaderom14.07.2010. u 11:15 - pre 116 meseci
Imam problem da ucitam fajl (tacnije izgleda kao report):

Redovi su otprilike ovakvi:

NALOG: 123-56-2010
---------------------
---------------------
INICIJATOR: 00 98 786 09062010
PS 0.00 01.03.2010 23.50 01.04.2010 126.59
NALOG: 176-30-2010
---------------------
---------------------
INICIJATOR: 00 98 786 09062010
PS 0.00 01.02.2010 7.50 01.03.2010 785.42
INICIJATOR: 00 98 786 09062010
PS 0.00 01.01.2010 7.50 01.03.2010 785.42
INICIJATOR: 00 98 786 09062010
PS 0.00 01.06.2010 9.50 03.06.2010 85.62
INICIJATOR: 00 98 786 09062010
PS 0.00 01.07.2010 10.50 01.06.2010 185.48
NALOG: 599-11-2010
---------------------
---------------------
INICIJATOR: 00 98 786 09062010
PS 0.00 01.01.2010 3.50 01.04.2010 826.59
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 2745



+1122 Profil

icon Re: Ucitavanje fajla sa razlicitim redovima SQL*Loaderom14.07.2010. u 12:07 - pre 116 meseci
Ako dobro shvatam format, ovde prvo ide red u kojem je broj naloga, zatim kao separator dva reda sa minusima, zatim promene (stavke) naloga koje su izražene sa po dva reda po stavci u kojima je prvo inicijator, a zatim sama promena.

Naravno, ovakav format nije pogodan za Sql*Loader, pa ga treba obraditi.

Evo awk programa koji to može da sredi:

Code:

$1=="NALOG:" {br_naloga=$2}
$1=="INICIJATOR:" {infield2=$2; infield3=$3; infield4=$4; infield5=$5}
$1=="PS" {print br_naloga, infield2, infield3, infield4, infield5, $2, $3, $4, $5, $6}


Ovaj kod se nalazi u fajlu, koji se, na primer zove obrada.awk.
Ulazni fajl nam je, na primer, promene.txt

program se poziva sa:

Code:
awk -f obrada.awk promene.txt >rezultat.txt


Evo fajla rezultat.txt :
Code:

123-56-2010 00 98 786 09062010 0.00 01.03.2010 23.50 01.04.2010 126.59
176-30-2010 00 98 786 09062010 0.00 01.02.2010 7.50 01.03.2010 785.42
176-30-2010 00 98 786 09062010 0.00 01.01.2010 7.50 01.03.2010 785.42
176-30-2010 00 98 786 09062010 0.00 01.06.2010 9.50 03.06.2010 85.62
176-30-2010 00 98 786 09062010 0.00 01.07.2010 10.50 01.06.2010 185.48
599-11-2010 00 98 786 09062010 0.00 01.01.2010 3.50 01.04.2010 826.59


Awk, ili njegov GNU ekvivalent gawk može se skinuti sa interneta, a inače je obično standardni deo svake Linux/Unix distribucije. Ja sam koristio gawk koji dolazi uz Cygwin koji se takođe može skinuti sa interneta, a predstavlja razvojno okruženje koje emulira Linux na Windowsu.

Za više informacija o awk/gawk pogledati manuale na internetu...

Your friendly vendor
 
Odgovor na temu

dacarica
dalibor lukić
bg

Član broj: 14845
Poruke: 56
*.alphabankserbia.com.



+8 Profil

icon Re: Ucitavanje fajla sa razlicitim redovima SQL*Loaderom14.07.2010. u 12:45 - pre 116 meseci
Ovo je fenomenalno, steta sto nemam pristup serveru koji je inace na unix-u, tako da ja radim sa stanice na winxp platformi i ucitavama fajl. Inace datoteka ima preko 5.000.000 redova. Znaci nikako nece ici preko loadera? Video sam komandu CONTINUEIF THIS pa cu probati?
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 2745



+1122 Profil

icon Re: Ucitavanje fajla sa razlicitim redovima SQL*Loaderom14.07.2010. u 12:51 - pre 116 meseci
Ne može preko loadera, zato što su podaci iz pojedinih redova zavisni jedni od drugih. Teoretski, kada bi postojali FK u zavisnim slogovima, mogao bi da učitaš u tri tabele, pa da se zavisnosti očuvaju.

Što se tiče Unix servera (u Grčkoj?) ni ne treba ti pristup. Predlažem ti da instaliraš Cygwin na svoju lokalnu mašinu (WinXP) i imaćeš sve što ti treba za Unix like egzibicije.

Evo linka za download samo gawk-a http://gnuwin32.sourceforge.net/packages/gawk.htm
A evo ga i link za Cygwin: http://www.cygwin.com/

[Ovu poruku je menjao djoka_l dana 14.07.2010. u 14:01 GMT+1]
 
Odgovor na temu

dacarica
dalibor lukić
bg

Član broj: 14845
Poruke: 56
*.alphabankserbia.com.



+8 Profil

icon Re: Ucitavanje fajla sa razlicitim redovima SQL*Loaderom14.07.2010. u 13:01 - pre 116 meseci
Hvala jos jednom.
 
Odgovor na temu

dacarica
dalibor lukić
bg

Član broj: 14845
Poruke: 56
*.alphabankserbia.com.



+8 Profil

icon Re: Ucitavanje fajla sa razlicitim redovima SQL*Loaderom14.07.2010. u 16:46 - pre 116 meseci
djole_l kako je izlazni format ako je polje null?
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 2745



+1122 Profil

icon Re: Ucitavanje fajla sa razlicitim redovima SQL*Loaderom14.07.2010. u 17:07 - pre 116 meseci
Izlaz bi bio prazan string, sve varijable u awk-u su u zavisnosti kako ih koristiš ili stringovi ili brojevi.

U gornjem awk programu sam koristio print <lista>, gde su varijable u listi razdvojene zarezima. Tada na izlazu awk ispisuje vrednosti varijabli razdvojene default output field separatorom koji je blanko. Modifikacijom varijable OFS može se promeniti koji je output field separator.

Na primer, ako se doda linija u awk program:

Code:

BEGIN {OFS=";"}


izlaz bi bio:

Code:

123-56-2010;00;98;786;09062010;0.00;01.03.2010;23.50;01.04.2010;126.59
...


Isto bi se postiglo i "-v" svičom:

Code:

awk -v OFS=";" -f ime_awk_fajla ...


Moglo bi se i u samom awk programu izmeniti da ako je polje prazno ispiše nešto, kao na primer:

Code:
awk '{print $1, $2=="" ? "NULL" : $2 }


Ovaj awk program bi čitao redove sa ulaza, ispisivao na izlaz prvo polje i drugo polje, osim kada je drugo polje prazan string, umesto čega bi pisao prvo_polje <blank> NULL.
Dalje, u awk programu, nakon što se pročita linija, varijabla NF dobija vrednost broja polja u tekućoj liniji, pa i to može da se iskoristi.

Veruj mi, ako se baviš administracijom, učenje awk-a će ti oduzeti samo jedan dan, ali ćeš mnoge tekuće probleme rešiti sa samo nekoliko redova awk programa...
 
Odgovor na temu

dacarica
dalibor lukić
bg

Član broj: 14845
Poruke: 56
*.alphabankserbia.com.



+8 Profil

icon Re: Ucitavanje fajla sa razlicitim redovima SQL*Loaderom14.07.2010. u 18:14 - pre 116 meseci
ma evo citam ali nigde nemogu da pronadjem kako da resim ovaj slucaj a zaboravih da ti napomenem

NALOG: 176-30-2010
---------------------
---------------------
INICIJATOR: 00 98 786 09062010
PS 0.00 01.02.2010 7.50 01.03.2010 785.42
INICIJATOR: 00 98 786 09062010
PS 0.00 01.01.2010 01.03.2010
INICIJATOR: 00 98 786 09062010
PS 0.00 01.06.2010 9.50 03.06.2010 85.62
INICIJATOR: 00 98 786 09062010
PS 0.00 01.07.2010 10.50 01.06.2010 185.48


pogledaj ovo plavo sto fali jedan podatak, znaci u originalnom fajlu sva polja su razmaknuta sa sepratorom blanko/space pa kad pustim kroz tvoj skript on sve ok uradi ali mi tu kolonu skrati tj. pojede mesto gde bi trebalo recimo null polje da bude eto to hocu da pronadjem ali se ubi nigde da nadjem kako da ucitas multiple line Records with null fields.
 
Odgovor na temu

dacarica
dalibor lukić
bg

Član broj: 14845
Poruke: 56
*.alphabankserbia.com.



+8 Profil

icon Re: Ucitavanje fajla sa razlicitim redovima SQL*Loaderom14.07.2010. u 18:16 - pre 116 meseci
tj ovaj plavi primer kada pogledas kroz UE ima spejsove (vise njih umesto taba) izmedju dva polja. A ne ovako kako je ispalo kako sam postovao.
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 2745



+1122 Profil

icon Re: Ucitavanje fajla sa razlicitim redovima SQL*Loaderom14.07.2010. u 19:06 - pre 116 meseci
Po default input field separator (FS) je "[ \t]+" tj. kombinacija space i tab koja se ponavlja 1 ili više puta. Pretpostavljam da ti imaš dva taba ili dva space.
Ako je tako, onda promeni da je FS=" " (jedan space) ili FS="\t" šta god da ti je separator. Takođe, cela linija koju awk učita nalazi se u varijabli $0, pa možeš da napraviš kakvu god hoćeš obradu linije.

Ne mogu da pogađam kakav ti je format ulaznih podataka. Pokušaj sam ili uploaduju txt fajl sa pravim podacima (reprezentativni podskup ulaznih podataka) pa da vidim šta je problem...
 
Odgovor na temu

dacarica
dalibor lukić
bg

Član broj: 14845
Poruke: 56
*.alphabankserbia.com.



+8 Profil

icon Re: Ucitavanje fajla sa razlicitim redovima SQL*Loaderom15.07.2010. u 11:03 - pre 116 meseci
Evo pogledaj primer...
Prikačeni fajlovi
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 2745



+1122 Profil

icon Re: Ucitavanje fajla sa razlicitim redovima SQL*Loaderom15.07.2010. u 11:49 - pre 116 meseci
Ovo je potpuno drugačije od onoga sa čime si pokrenuo temu.

U pitanju je slog fiksne dužine, između reči "INICIJATOR" i znaka ":" postoji razmak, a i broj polja u slogu INICIJATOR nije isti kao u početnom primeru. Nakon reda INICIJATOR može da ide i neki drugi red, a ne samo 'PS'. Pretpostavljam da je to oznaka tipa transakcije (PS za početno stanje, druge oznake za neke druge tipove) i da je ta oznaka bitna za dalju obradu.

Iako awk/gawk može da obrađuje i slogove fiksne dužine, to ovde nije potrebno. Napravio sam program koji jednostavno pravi drugi slog, takođe fiksne dužine, ali formira redove koji su pogodniji za obradu.

Evo awk programa (i uploadovani fajl):
Code:
/NALOG:/ {br_naloga=$2}
/INICIJATOR :/ {inicijator = substr($0, 14, 51); getline; printf "%-20s%s %s\n", br_naloga, inicijator, $0}


a rezultati su u drugom fajlu.

Prikačeni fajlovi
 
Odgovor na temu

dacarica
dalibor lukić
bg

Član broj: 14845
Poruke: 56
*.alphabankserbia.com.



+8 Profil

icon Re: Ucitavanje fajla sa razlicitim redovima SQL*Loaderom15.07.2010. u 13:28 - pre 116 meseci
Hvala puno ovo je odlicno djole.
 
Odgovor na temu

dacarica
dalibor lukić
bg

Član broj: 14845
Poruke: 56
*.alphabankserbia.com.



+8 Profil

icon Re: Ucitavanje fajla sa razlicitim redovima SQL*Loaderom16.07.2010. u 12:26 - pre 116 meseci
Djole imam jos jedno pitanje:

Ako mi je prvakolona nalog u jednom redu popunjena, a u drugima nije, kako da uzmem u varijablu taj broj naloga i popunim sve ostale dok ne dodje drugi broj naloga.
 
Odgovor na temu

[es] :: Oracle :: Ucitavanje fajla sa razlicitim redovima SQL*Loaderom

[ Pregleda: 3379 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.