Win alatti programozas par nap alatt
hwsw famulus
hwsw at famulus.hu
Fri Mar 11 11:21:08 CET 2005
>Van sokfele' (VB nincs), nagyon hatekony szoveges fajlkezelese van:
..nono!
Egyszer megkene nezned a
scripting objektumok nevvel
alcazott reszeket is!!
Elfogsz csodalkozni....
Alabb idezek egy levelezest a temaban..
(kicsit szerkesztve)
De sok minden mas is helybol kezelheto.
KJ
> szia: Balazs
------------------------------
<sandor>
Nehezn hiszem, de valoban ilyen nehezkes VB6-bol rendesen beolvasni
idezojelekkel hatarolt ertekeket?
</sandor>
Nem igaz. tok egyszzeru.!!!
a file sorait termeszetesen Scripting.FileSystemObject-el.
A Line Input es a FreeFile faszom a hatvanas evek csucsprogramozasa, nem
igaz, hogy
2002-ben valaki meg ezen a szinvonalon matyizik. az sem igaz, hogy
nyolcmilliard ember (a kapucnigyar ~ igy szamolta ki) baromkodik
2002-ben ebben a vizualisnak nevezett loszarban.
-fel kell dolgozni egy file-t
-a file sorkobol all, ezeknek a feldolgozasa nem okoz problemat
-minden sor kiskigyokbol all, ezekkel van a gond
-minden kiskigyo "-el kezdodik, "-al vegzodik es a ketto kozott barmi
lehet - kiveve "-t magat
(tegyuk fel, hogy ez egy egyszeru kiskigyo, nincsenek beagyazott
idezojelek)
a kiskigyok kinyeresere egy sorbol irhatunk valami izomkodot, de ha
alternativan gondolkodunk - mondhatjuk azt is, hogy ez tok jol leirhato
egy un regularis kifejezessel. regularis kifejezeseket a vb nativan nem
tud, de mint az ADODB, az MSXML egy valamilyen RegExp csumbragambra is
rendelkezesunkre all - hala a kapucnigyarnak. hivatalos neve: "Microsoft
VBScript Regular Expressions 5.5 (ver 5.5). ha az igen vizual ide-ben
hekkelunk eppen a references-nel kattinthato be (mint ahogyan az MSXML,
ADODB, stb).
tok jo, hogy van ilyenunk. most mar csak az okozhat problemat, hogy a
regularis kifejezesek miniprogramnyelven leirjuk mit is akarunk.
elsore valami ilyesmi kerekedik elo:
"[^"]*"
ebben elofordulnak olyan karakterek amelyeket a regexp bigyo annak vesz
mint aminek leirtuk, tovabba specialis jelentessel birok is.
gondoljunk arra mikor az irjuk, hogy "dir *.txt". ez ugyan kicsit
(teljesen) mas, de kapaszkodonak jo.
szedjuk darabokra:
" - azt jelenti, hogy "
[^"] - azt jelenti, hogy barmi, csak nem " (a ^ jelenti a nemet)
* - azt jelenti, hogy az elozobol (tehat nem "-bol) 0 vagy akarmennyi
" - azt jelenti, hogy "
ha pl azt szeretnek, hogy a ket idezojel kozott legalabb egy karakter
legyen, akkor a * helyett +-t irnank.
stb.
regexp magyarazatokkal tele a web, aki keres az talal.
itt van pl egy kedvenc szajtomon, a zvon-on:
http://www.zvon.org/other/PerlTutorial/Output/index.html
az alapotlet megvan, a tovabbiakban csak ragozzuk.
tulajdonkeppen a kiskigyoink igy neznek ki, de nekunk nem kell a kezdo "
es a zaro ".
ezert ezt irjuk:
"([^"]*)"
a () koze tett reszt kesobb egyszerun ki tudjuk emelni es nem kell
mindenfele visual kvazimodo Left, Mid, InStr, stb allatsagokkal
vegervenyesen karbantarthatatlana tenni a kodot.
tovabba ilyen kiskigyobol tetszoleges szamu lehet egy sorban, ezert az
elobbi mintat a sorra magara globalisan kell ertelmezni. ez vb eseten
kicsit maskent nez ki mint pl Perl-ben, a peldakod megvilagitja.
a peldakodban a mintat string konstanskent adjuk meg, jol tudjuk, hogy a
Visual Workaround-ban a string konstanskoba agyazott "-k ""-kent irodnak
(nehogy man lenne valami escape vagy valami, attol kevesbe lenne
Visual).
<off>
itt majdnem minden nyelven rohognom kell, mikor a Perl-hez viszonyitok,
ahol azt tekintjuk idezojelnek ami eppen kenyelmes.
</off>
+++
a peldakodot es a te konkret adatfile-odat egy zip-ben mellekelem
(test.vbs, test.txt).
azert vbs mert vegervenyesen megszabadultam a Vizual Koncepciotlan
Workaround-tol.
vettem nehany kilo sot meg egy eket. meg a nyomat is felszantom es
beszorom soval.
+++
<sandor>
Hat igen nem erositettetek meg, hogy van sokkal egyszerubb megoldas. A
Split lehet hasznos lesz. De nem lesz szep es egyszeru kod (meg ugye
kozben adatbazisba megy bele, sql meg querydef a jo kis parameterses
izesitessel, ugye minden mas mezobe kerul majd be, es tobb tablaba :) )
Szoval a sorok cincalasat nem uszommeg ugy tunik.
</sandor>
mar lattam olyan kodot ahol szinte az alkalmazas egesz logikaja egy
Command1_Click-be volt belekodolva (egy szerencsetlen balfasz formon ~
16k sornyi kod). a 'how to write unmaintanable code' iskolapeldaja. ha
mindent egy eljarasba akarsz bezsufolni, akkor soha az eletben nem lesz
szep es egyszeru kodod. viszont ha a mezok olvasasat szepen kirakod egy
osztalyba, lenyegesen megszepul es leegyszerusodik. elege nhezen hiheto,
de meg ebben az lenyomoritott semmire sem jo vacakban is lehet a
korulmenyekhez kepest elegans/egyszeru kodot irni (nem totya mondta,
konretan lattam - tobbszor is). nem is beszelve arrol, hogy mashol es
maskor is fel tudod hasznalni. kvazi hon szeretett Progress-ed
szintejere egyszerusodik a dolog - ha te is ugy akarod.
+++
a peldakod a cscript-el futtatando, ugyanis az StdOut-ra ir.
a cscript-ben a "c" nem a "C" nyelvre, hanem "C"onsole-ra utal.
valahogy igy:
cscript test.vbs
mindezt a csunya es fekete parancssorbol...
van aki eloszeretettel hasznalja a WScript.Echo-t a peldascriptekben, ez
azert gyokerseg mert ha nem a cscript az alapertelmezett engine, es
eppen egy benga ciklus kozepebe sikerult belefejleszteni, akkor nem
gyozzuk lelodozni a messageboxokat.
a cscript ugy teheto alapertelmezette, hogy beirjuk:
cscript /?
majd kiokoskodjuk, hogy:
cscript //H:CScript //Nologo //S
ezek utan pl az StdOut-ot hasznalo scripteket eleg ugy inditani, hogy:
test.vbs
(nem kell ele a cscript)
+++
ha azt szeretned, hogy a kezdo es zaro szokozbigyok is eltunjenek, akkor
hasznald a kovetkezo mintat:
"\s*([^"])\s*"
a \s* azt jelenti, hogy whitespace-bol nulla vagy tobb (szokoz, tab,
stb).
mivel ezek a ()-n kivul esnek nem kell atomware ilyen-olyan trim sem.
+++
a regularis kifejezesekbe erdemes nemi energiat belefeccolni. akarki
akarmit is mond.
+++
a legjobb konyv a regularis kifejezeskrol:
http://www.oreilly.com/catalog/regex/
ez a _kony_ a temaban. egy ember irta, nem egy focicsapat (wrox
szinekben).
nem szerintem a legjobb, hanem egyszeruen a legjobb.
udv,
petert
-----Original Message-----
From: Sandor [mailto:sandortol at axelero.hu]
Sent: Tuesday, February 12, 2002 8:54 PM
To: TechNetKlub.hu Fejlesztoi levelezési lista
Subject: VB fajbol adatbe
Sziasztok,
Nehezn hiszem, de valoban ilyen nehezkes VB6-bol rendesen beolvasni
idezojelekkel hatarolt ertekeket? Azaz soronkent, karakterenkent szet
kell cincalni, es ellenorizni, ha idezojel akkor onnatol a kov.
idezojelig gyujtsuk stringbe, aztan konvertaljuk stb? Pl egy ilyen
adatallomanystrukturat:
"1234" "2001-JUL-30" " 12345-123" "2001-JUL-20"
"kod1" "18" "6650" "50" "2146" "0"
"kod2" "1400" "39390" "0" "10014" "0"
"kod3" "1963" "99970" "6760" "17435" "0"
"kod4" "154" "8000" "0" "1500" "0"
"kod5" "424" "5600" "0" "388" "0"
"kod5" "914" "40500" "0" "8611" "0"
"kod7" "0" "0" "0" "0" "0"
"1235" "2001-JUL-30" " 12345-124" "2001-JUL-20"
"kod1" "188" "6650" "50" "2146" "0"
"kod2" "1080" "39390" "0" "10014" "0"
"kod3" "1986" "99970" "67680" "17435" "0"
"kod4" "158" "8000" "0" "15800" "0"
"kod5" "482" "56800" "890" "388" "0"
"kod5" "91" "40500" "0" "8611" "0"
"kod7" "0" "0" "0" "0" "0"
Mert ugye nem lehet fix szelesnek tekinteni a valtozo ertekek miatt.
Progressben pl egy olyen sor valtozokba tetele egy sorral elintezheto:
IMPORT valt1 valt2 valt3 valt4... stb valtozokba szepen az idezojelekkel
hatarolt ertekeket beteszi, sot meg konvertalja is alapbol! fso
objectummal ugye csak TextStream az ami erre alkalmas
"hagyomanyos" #Input az mar jobb lenne, de ott is "ertek","masik ertek"
a truktura ami megint nem jo....
Udv, Sanyi
More information about the Elektro
mailing list