Sziasztok,
van egy ca. 9500 db termékböl álló listám excelben, ezeket egy másik mappába olvasom be vba-val sorról sorra.
Van opció a duplán megjelenö termékek kiszürésére is. Jelenleg ez úgy müködik, hogy mielött berakom az éppen beolvasott terméket egy tömbbe, megnézem, hogy a tömbben már benne van-e. Ez elég lassú(kb 15mp.) és exponenciálisan nö több termékkel, de utána már csak ca. 7300 termék marad.
A következöt gondoltam ki és már müködik is nagyjából:
gyártok egy függvényt, ami a termékek leírásából gyárt egy hash értéket (jelenleg 1 és kb 1.000.000 között), long adattípusban. Egy bool tömbben (1.000.000 elemmel) megnézem, az adott hash index alatt "false" érték van-e - ha igen, berakom a terméket a másik tömbbe, és a hash index alatti értéket "true"-ra változtatom (a két listának az az oka, hogy meg kell tartanom az eredeti sorrendet a termékek között, ezért egy igazi hash tabella nem játszik).
Ez eddig jól müködik, csak még nem sikerült olyan függvényt gyártanom, amelyik az összes termékleírásra tud egyedi hash értéket generálni (kb 7200-ra sikerül*).
Van valakinek ötlete egy gyors és müködö függvényre? Excelben/VBA-ban nincs md5 vagy sha1, ezeket idegen könyvtárakból nem akarnám betölteni, és ezek nem is egésszámú indexeket generálnának. Persze ha sikerül lejebb szorítani a max. hash értéket, azért sem haragszom.
Jelenleg a betük ascii értékét a karakterlánc beli elhelyezkedésükkel kombinálom és modulo 6 maradékkal dolgozva más és más értéket is hozzá adok a maradékosztály által elöállított blokkoknak.
elöre is köszi a tippeket.
*egy eshetöség létezik még, hogy az eredeti, tömb-végig-keresös-algorithmus hibázik és tényleg csak ca. 7200 termék van duplák nélkül - ezt még nem teszteltem.
- 5478 megtekintés
Hozzászólások
Ha nem tömbbe töltenéd, hanem hashbe? Én ilyenkor simán kulcsként használom a már látott elemeket, bár vbat nem szoktam, és ha egy kb 10k hosszú listán végigszaladni 15 sec az nagyon gyász...
- A hozzászóláshoz be kell jelentkezni
mármint hogy értve, hogy hashbe?
vba elég korlátozott, alapból nincs asszociatív tömb. és hát ugye a 10k listán ca. 10k-szor kell végig menni, innen ered a 15s
és a fö kérdés, a hash érték elöállítása ezzel még mindig nem megoldott
--------
HOWTO: Zentyal+Zarafa+Setup+Outlook+Thunderbird+mobilephone sync
- A hozzászóláshoz be kell jelentkezni
jahogy nincs hash (mármint asszociatív tömb), akkor szorri.
Ill, biztos vagy benne? http://stackoverflow.com/questions/1309689/hash-table-associative-array…
úgy látom valami ilyesmi mehetne (erősen pseudo kódos, szorri)
Dim d As dictionary
Set d = New dictionary
Dim nev As String
While not EOF termékek
nev = nev_beolvasasa(aktuális sor)
If not d("termekneve") Then
amit_csinalni_akarsz.
d("termekneve") = True
End If
End While
---
Egyébként úgy látom, hash függvények is vannak:
http://stackoverflow.com/questions/14717526/vba-hash-string/14749855#14…
- A hozzászóláshoz be kell jelentkezni
hejj, köszi, föleg a 2. link nagyon hasznos - nekem nem volt ennyi szerencsém a kereséssel!
--------
HOWTO: Zentyal+Zarafa+Setup+Outlook+Thunderbird+mobilephone sync
- A hozzászóláshoz be kell jelentkezni
pedig elég let me google that for you típusú volt. ;)
(ellenben szerintem a dictionary eleve pont azt csinálja, amit te szeretnél a tömbbel meg a hash függvénnyel, csak várhatóan kicsit gyorsabban).
- A hozzászóláshoz be kell jelentkezni
nem szoktam másokat gugliztatni helyettem... :)
a dictionary-t még nem ismertem, ezt is megnézem, ahhoz meg jók a stackoverflow-n látható függvények. majd megírom melyik a gyorsabb
--------
HOWTO: Zentyal+Zarafa+Setup+Outlook+Thunderbird+mobilephone sync
- A hozzászóláshoz be kell jelentkezni
eszembe nem jutna vba-ban varazsolni, inkabb csv-be exportalnam, aztan valami szovegfeldolgozasra feher ember szamara alkalmasabb nyelven (pl. perl) oldanam meg a taszkot...
--
"A politikat, gazdasagot es a tobbi felsorolt faszsagot leszarom, amig engem nem erint (nem erint)" (bviktor)
- A hozzászóláshoz be kell jelentkezni
Látszik, hogy nem dolgoztál még kereskedőcégnél.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
mibol jottel ra?
--
"A politikat, gazdasagot es a tobbi felsorolt faszsagot leszarom, amig engem nem erint (nem erint)" (bviktor)
- A hozzászóláshoz be kell jelentkezni
Onnan, hogy nekiállsz CSV-vel, Perllel és szövegfeldolgozással vagdalózni egy táblázatkezelési feladatnál.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
egyébként tényleg így van, egy komplex kalkulációs segédeszköz része - és azt hiszem kijelenthetem, ennek segítségével az ajánlatadások kb faktor 10-el, ha nem többel, lettek gyorsabbak és "melléktermékként" egy grafikus sémát is kidob a rendszer, ami a cég ügyfeleinél nagyon jó visszhangra lelt.
Az Excel szerintem zseniális és a VBA-val is úgy ahogy megbékéltem már - vannak (nagy) hiányosságai az objektorientálás terén, de ez van
--------
HOWTO: Zentyal+Zarafa+Setup+Outlook+Thunderbird+mobilephone sync
- A hozzászóláshoz be kell jelentkezni
Nekem nem kell mondani, egy számtech/fotó kisker/nagyker cégcsoportnál vagyok jelenleg, tudom mit művelnek Excelben azt is, hogy mi az előnye, mi a hátránya.
A probléma ott kezdődik, mikor valaki fogalom nélkül elkezd a partvonalról okoskodni anélkül, hogy realizálná, hogy miért - jelen esetben az Excel - lett a kvázi ipari standard.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
Mé', hát lehet keverni is:
http://support.microsoft.com/kb/214797
:-)
- A hozzászóláshoz be kell jelentkezni
Mert? Az excel pont erre való. Én szeretem a perlt, de van egy csomó olyan, amit excelben rém kényelmes megcsinálni, mert sokkal könnyebb interaktívan beleturkmányolni.
A VBA fehér ember számára pont sokkal átláthatóbb mint a perl. (Fehér ember alatt érts nem programozót, és igen, ettől még szerintem is randa). Ja, és persze ott van, nem kell perl interpétert telepíteni, fájlokkal baszakszani, meg command linenal. Ráadásul a felvetett probléma kb "triviális". Sem kirívóan sok adat nincs benne, sem semmi bonyi probléma, a gugli alapján látszik, hogy kb 1x1, a topik létezésének egyetlen oka, hogy a kérdező valahogy átsiklott felette.
Szal all in all, ez egy tipikus kalapcsáod van, mindent szögnek nézel szűklátókörű vélemény volt.
- A hozzászóláshoz be kell jelentkezni
Erről jut eszembe: egyszer egy ismerős kérte, hogy segítsek már neki valamiben, mert Excelben szeretne valamilyen kalkulációs dolgot elvégezni (gyakorlatilag adott paraméterek alapján halom adat közül keresni kellett megfelelő dolgot). Elvileg Excelben is megoldható lett volna, egy Excel hakkoláshoz jobban értő talán még egyszerű módot is talált volna rá, de számomra triviálisabbnak tűnt az Access az SQL és a formok, riportok miatt.
Úgy, hogy VBA-nak úgy kellett utánanézem, a srácnak meg főleg (villamosmérnökként egyetemen tanult ugyan egy kis programozást, de egyrészt sosem szerette másrészt nem is ment neki annyira ha jól emlékszem), plusz SQL alapjait is nekem kellett elmagyarázni, ráadásul az Access-t sem használta szerintem, egy kis iránymutatással egész jól abszolválta a feladatot.
Igen, a feladat olyan, amire én helyből nyitnám a Visual Studiot/Eclipset/akármit, viszont azért elég jól példázza, hogy azok, akik nem értenek hozzá kis segítséggel képesek "programocskákat" készíteni, amellyel hatékonyabbá tehetik a munkájukat. Ebben van az MS Office egyik előnye. Sokszor egyszerűbb csinálni egy Exceles számolótáblát valamire, mint nekiállni kódolni.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
persze. Én rendszeresen anyáztam mikor még a céges szabvány a 2003as office volt, mert a köcsög excel 64k sornál többet nem tud, és tök örültem, mikor 2010 lett. Aztán múltkor azt is megcsukóztattam, ott is van sorhatár...
- A hozzászóláshoz be kell jelentkezni
na itt az igért update:
- saját hash-függvény kilöve, nem sikerült olyat kitalálnom, ami mind a ca. 7300 elemre egyedi hash-t adott volna
- ha sikerült is volna, a jövöben több terméknél nem lehettem volna biztos benne, hogy nincs ütközés
- minél komplikáltabb volt a függvény, annál lassab volt a feladat (ca. 7100-nál már 4-6mp)
- dictionary megoldás: 1mp
köszi mindenkinek a segítséget!
--------
HOWTO: Zentyal+Zarafa+Setup+Outlook+Thunderbird+mobilephone sync
- A hozzászóláshoz be kell jelentkezni
http://en.wikipedia.org/wiki/Bloom_filter
--
NetBSD - Simplicity is prerequisite for reliability
- A hozzászóláshoz be kell jelentkezni
na, ez érdekes és hasonlít az én megoldásomhoz is. már csak 2 független hash függvény kell, az egyik meg a fenti linkböl lehetne pl "CRC16 twice"...
köszi!
--------
HOWTO: Zentyal+Zarafa+Setup+Outlook+Thunderbird+mobilephone sync
- A hozzászóláshoz be kell jelentkezni
igen, jo volt az alapgondolat :)
--
NetBSD - Simplicity is prerequisite for reliability
- A hozzászóláshoz be kell jelentkezni
Ahogy ezt mondani szoktak: ICBM-el muslicara. :)
- A hozzászóláshoz be kell jelentkezni
mindamellett, hogy ügyes, szerintem ide overkill.
- A hozzászóláshoz be kell jelentkezni
Troll leszek: http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html
--
arch,xubuntu,debian,windows,android
dev: http://goo.gl/7Us0GN
BCI news: http://goo.gl/fvFM9C
- A hozzászóláshoz be kell jelentkezni
Ha már trollkodsz, trollkodj rendesen:
http://stackoverflow.com/questions/1309689/hash-table-associative-array…
:)
Szerk.: most látom, hogy fenntebb is írták.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
Próbáld ki esetleg azt is, hogy nem beolvasás közben keresgélsz duplikációkat, hanem először beolvasol mindent, és csak utána szűrsz.
- A hozzászóláshoz be kell jelentkezni
nincs mérhetö különbség, ha jól látom - az én hash függvényemmel a szürés és tömbbe töltés 1mp
--------
HOWTO: Zentyal+Zarafa+Setup+Outlook+Thunderbird+mobilephone sync
- A hozzászóláshoz be kell jelentkezni
A Remove Duplicates gomb nem működik excelben?
- A hozzászóláshoz be kell jelentkezni
a termék/árlistát nem fogom megváltoztatni, az évente 2x van hivatalosan kiadva. ott vannak a duplák benne, mert 6 különbözö lapon vannak az egyes termék kategóriák felsorolva, de vannak átfedések.
ezt a listát emelem át VBA-val egy saját, új excel-mappába, amiben a kalkuláció és konfiguráció történik
--------
HOWTO: Zentyal+Zarafa+Setup+Outlook+Thunderbird+mobilephone sync
- A hozzászóláshoz be kell jelentkezni
"a termék/árlistát nem fogom megváltoztatni, az évente 2x van hivatalosan kiadva. ott vannak a duplák benne, mert 6 különbözö lapon vannak az egyes termék kategóriák felsorolva, de vannak átfedések"
Hajjaj, az ilyeneket utáltam legjobban, mikor fel kellett dolgoznunk. Jellemzően az egyes lapok fejlécei (még az azonos funkcionalitásúak) véletlenül sem egyeztek meg, egy-egy kiadás között random variálva lettek. Van rá toolunk, de mindig kell picit hozzáigazítani egy listához. Nem értem, hogy sokan miért nem képesek kiadni normálisan, konzisztens listát.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
Keress egy implementált md5 vagy sha függvényt, pl itt
- A hozzászóláshoz be kell jelentkezni
mint a topic elején írtam, nem szeretnék külsös lib-eket betölteni, inkább egy saját hash függvény érdekelne. azért köszi a linket!
--------
HOWTO: Zentyal+Zarafa+Setup+Outlook+Thunderbird+mobilephone sync
- A hozzászóláshoz be kell jelentkezni
Ezt tanulmányozd: http://hu.wikipedia.org/wiki/Hash_t%C3%A1bla, a belőle linkelt születésnap paradoxon oldalt is.
- A hozzászóláshoz be kell jelentkezni