Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

Ucitavanje fajla sa razlicitim redovima SQL*Loaderom

  • 13 odgovora
  • 7.032 pregleda

Najnovija ↓

Ucitavanje fajla sa razlicitim redovima SQL*Loaderom 14.07.2010. u 12:15 · pre 198 meseci #1
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
Re: Ucitavanje fajla sa razlicitim redovima SQL*Loaderom 14.07.2010. u 13:07 · pre 198 meseci #2
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
Re: Ucitavanje fajla sa razlicitim redovima SQL*Loaderom 14.07.2010. u 13:45 · pre 198 meseci #3
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?
Re: Ucitavanje fajla sa razlicitim redovima SQL*Loaderom 14.07.2010. u 13:51 · pre 198 meseci
izmenjeno 1 put, poslednji put djoka_l 14.07.2010. u 14:01
  1. djoka_l14.07.2010. u 14:01zapis iz teksta poruke
#4
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/
Re: Ucitavanje fajla sa razlicitim redovima SQL*Loaderom 14.07.2010. u 18:07 · pre 198 meseci #7
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...
Re: Ucitavanje fajla sa razlicitim redovima SQL*Loaderom 14.07.2010. u 19:14 · pre 198 meseci #8
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.
Re: Ucitavanje fajla sa razlicitim redovima SQL*Loaderom 14.07.2010. u 20:06 · pre 198 meseci #10
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...
Re: Ucitavanje fajla sa razlicitim redovima SQL*Loaderom 15.07.2010. u 12:49 · pre 198 meseci #12
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.

Re: Ucitavanje fajla sa razlicitim redovima SQL*Loaderom 16.07.2010. u 13:26 · pre 198 meseci #14
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.
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme