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