ããŒã¿ã®èª¬æ
ç§ã¯ãã¬ã³ã ã§åããŠããŸãïŒåºå®é»è©±ãã€ã³ã¿ãŒããããIPãã¬ãã©ããŒã ã¿ã¹ã¯ã«ã¯ãPBXãIPãã¬ãã©ããŒãµãŒããŒããã®ãã©ãã£ãã¯ã®åŠçãçŸåšã®èª²éã®ãµããŒãããœãããŠã§ã¢ã®äœæããããã¯ãŒã¯ããã¡ã€ã³ã®ç®¡çãå«ãŸããŸãïŒã¯ããããã¹ãŠã®ååŒã®ãžã£ãã¯ãïŒã æè¿ãçµç¹ã«æ°ããæ©åšãã€ã³ã¹ããŒã«ããããŸã£ããç°ãªãåçã§åäœããããã«å¿ããŠãã©ãã£ãã¯ãå€æŽãããŸããã çŸåšãå€ãã¹ããŒã·ã§ã³ãšæ°ããã¹ããŒã·ã§ã³ã®2ã€ã®ããŒãžã§ã³ããããŸãã æ°ãããã©ãã£ãã¯ã¯ããã€ããªåœ¢åŒãšããã¹ã圢åŒã§è€è£œãããŸãã ãã€ããªã¯ãŸã£ããç§ãã¡ã«ã¯åããŠããŸããïŒãã ããäžéšã®äººã¯ç¥ããªããã¡ã«ããªãããã«ããã®ã§ããããããèªåã§è«æ±ããŸãïŒãïŒã å€ãæ©åšããã®ãã©ãã£ãã¯ã¯ãŸã é²è¡äžã§ãããããŒã«ã«DBMSã®ãµãŒãã¹ã䜿çšããŠã確ç«ãããã¹ããŒã ã䜿çšããŠããŒãããŒãšäžç·ã«æããŠããŸãã æ°ããã¹ããŒã·ã§ã³ããã®ãã©ãã£ãã¯ã«åããµãŒãã¹ãèšå®ããããšã¯å¯èœã§ãããããã€ãã®æ©èœãçºèŠãããŸããã æ°ããã¹ããŒã·ã§ã³ã®ãã©ãã£ãã¯ã¯ã15åããšã«åå¥ã®ãã¡ã€ã«ã«æžã蟌ãŸããŸãã åèšã§ãæã«çŽ3,000åã®ãã®ãããªãã¡ã€ã«ãååŸãããŸãïŒçæ³çã«ã¯-31æ¥éã§2976ã30æ¥éã§2880ïŒã çæ°ã®ããã«ãåãã¡ã€ã«ãåå¥ã«ã€ã³ããŒãããããšã¯ãããŸããã ãããã¯ãã¹ãŠããã¹ãã§ãããã³ãŒã«ã¬ã³ãŒãã¯è¡ããšã«é 眮ãããããããããã1ã€ã«ããŒãžããããšãå¯èœã§ãã æåããŒãžã¯æ¬¡ã®ããã«ãªããŸããå æã®ã¿ãã¡ã€ã«ãéžæããã³ãã³ãã©ã€ã³ã§æãåçŽãªããŒãžã¹ã¯ãªããã«è¿œå ããŸãã ãã¡ã€ã«åã®åœ¢åŒã¯åºå®ãããŠãããããå䜵ãèªååã§ããŸãã幎ãšæã解æããã ãã§ãã Linuxã¯ã Bash ã PerlããŸãã¯Pythonã®ããããã䜿çšããŸããå®äŸ¡ã§éœæ°ã§ããã1åã®æäœã§Windowsãã·ã³ã«ã€ã³ã¹ããŒã«ããã®ã§ã¯ãªãã PowerShellã§ãåæ§ã§ãã ãããŠcmdã¯ãç§ãã¡ãããç¥ã£ãŠããåé¯ã§ãã ;ïŒæåŸã«ãDBMSããŒã«ã䜿çšããŠããŒãžããã³ã€ã³ããŒãããåŸã§ããå€ãã®æåSQLäœæ¥ãå¿ èŠã ã£ãããããã©ãã£ãã¯èªäœã«ãé©ããèŠã€ãããŸããã äžè¬ã«ããããã®èŠå ã¯ã©ãã«ãããŠHaskellã®ã¿ã¹ã¯ã«ããŸãçºå±ããŸããããã®ãšãïŒ2011幎4æãã5æïŒãç 究ãå§ããŸããã
ãããã£ãŠã1ãæãããçŽ3,000ã®15åãã¡ã€ã«ã æ©åšã§ã¯ãééãå€æŽãã15åã§ã¯ãªãã5ã10ã30ã45ãªã©ã®ä»ã®å€ãèšå®ã§ããŸãããã¡ã€ã«ã®æ°ãšãµã€ãºã¯ããããå€æŽãããŸãã ãã¡ã€ã«åã®äŸïŒ2011幎5æ9æ¥09:30:00ïŒïŒ
999992011050909300081.txt 99999-æ©åšã«çž«ãä»ããããèå¥åïŒæãããªçç±ã«ãããç§ã¯ããã9ã€ã«çœ®ãæããŸããïŒ 2011-幎 05-æ 09-æ¥ 09-æé 30å 00-ç§ 81-ãããã10åã®1ç§ã®ä¹±æ°ã
ãµãã¹ã¯ã©ã€ããŒãå¢ããåãã¡ã€ã«ã®ãµã€ãºã¯çå®ã«å¢å ããŠããŸãã çŸåšããã¡ã€ã«ããšã«å¹³å240è¡ããããŸãããå€å£ã®å£ç¯çãªæ²äžããããäŒæã«åºããã人ã¯å°ãªããªããŸããã 9æã«ã¯ã1.5ã2åã®ã¢ã¯ãã£ããã£ã®å¢å ãèŠèŸŒãŸããŸãã
é話èšé²ã¯å€æ§ã§ãã ãã£ãŒã«ãã®æ°ãç°ãªãã¬ã³ãŒãã«ã¯ããã€ãã®ç°ãªãã¿ã€ãããããŸãã R210ã®ãããªãšã³ããªã¯éåžžã«ãŸãã§ããããã®æå³ãç解ã§ããŸããã§ããïŒä»¥éããã©ãã£ãã¯ããŒã¿ã¯ã©ã³ãã ããŒã¿ã«çœ®ãæããããŸãïŒã
| R210 | 2011-06-24 21ïŒ43ïŒ53 | 2011-06-24 01ïŒ43ïŒ52 | 1 |
ã芧ã®ãšãããã¬ã³ãŒãã¿ã€ãèå¥åãéå§æ¥ãçµäºæ¥ïŒISO 8601 / SQL圢åŒïŒãããã³äœããã®çç±ã§1ã€ã®ãã£ãŒã«ãã®ã¿ããããŸãã ãã£ãŒã«ãã¯ãã¬ã³ãŒãã®å é ãšæ«å°Ÿã«ããåçŽããŒã§åºåãããŠãããããå®éã«ã¯ããã«1ã€ã®ãã£ãŒã«ããã€ãŸã5ããããŸããã€ã³ããã¯ã¹0ã®ãã£ãŒã«ããæåã®åçŽããŒã®åã«ãããšæ³å®ãããšäŸ¿å©ã§ãã ãã®åŸãéèŠãªãã£ãŒã«ãã®ã«ãŠã³ãããŠã³ã¯1ããå§ãŸããŸãã
éåžžã®åŒã³åºãã¯ãR200ãªã©ã®ã¬ã³ãŒãã«èšé²ãããŸãã ãã§ã«152ã®ãã£ãŒã«ãããããããã¯æ©åšäžã§åæ§æã§ããŸããäžéšã®ãã£ãŒã«ããè¿œå ãäžéšãåé€ããã®ä»ã¯ãã©ãŒããããå€æŽã§ããŸãã
| R200 | 99999 | 111111 | CRãCSãAM | 1 | 1 | 3022 | 222222 | 333333 ||| 2011-06-23 11ïŒ33ïŒ58 | C | 2011-06-23 11ïŒ34ïŒ22 | S | 0 | 16 | 1 |||||| 1 | 1 |||||| 3 | 162 | 17 | 1 | 12 | 24 ||||||||||| 16 | 0 |||| || 192.168.1.172 || 192.168.1.12 |||||| 8 | 8 | 20 | 20 | 64 | 64 | 20 | 0 | 0 | OS | 7777 | 8888 | 555555 | 666666 | 0 | 8 | 9 | ||| OS | 19 ||| 30 | 10 | 42 | 43 |||||||||||||| 1 ||||||| 1 | 1 | 0 | 3 || 222222 ||||| || 2 | 1 || 333333 |||||||||||||||||||||||||||||||||||||
ã€ã³ããã¯ã¹[ 7ã8ã9ã12ã14ã36ã112ã122 ]ã®ãã£ãŒã«ãã«èå³ããããæçµçã«ã¯ãDBMSã«ã€ã³ããŒãããããªãããã«ãäžèŠãªãã®ããã¹ãŠé€å€ããããšæããŸãã çããŒã¿ããå¿ èŠãªãã®ã ããéžæãããšã次ã®è¡ãåŸãããŸãã
èšé²ïŒ3022 | 222222 | 333333 | 2011-06-23 11ïŒ33ïŒ58 | 2011-06-23 11ïŒ34ïŒ22 | 24 | 222222 | 333333 ã€ã³ããã¯ã¹ïŒ7 | 8 | 9 | 12 | 14 | 36 | 112 | 122 ã€ã³ããã¯ã¹| 説æ --------------------------- 7 | ç¥å€ã®åžå€å±çª 8ã112 | çºä¿¡çªå· 9ã122 | çä¿¡çªå· 12 | äŒè©±ã®éå§æ¥æ 14 | çµäºæ¥æ 36 | ç§åäœã®é話æé
ä»ã®ãã¹ãŠã®ãã£ãŒã«ãã¯ç¹ã«å¿ èŠãããŸããã ããªããèŠãããã«ãããã€ãã¯äžè¬ã«ç©ºã§ãããä»ã®æå³ã¯äžæã§ãã ïŒå€æŽãããïŒIPã¢ãã¬ã¹ããRTPãã©ãã£ãã¯ãééããé»è©±ãããã¯ãŒã¯ã€ã³ãã©ã¹ãã©ã¯ãã£ã®2ã€ã®ããŒãã«å±ããŠããªãéãã ãããã®ãã£ãŒã«ããã€ã³ããŒãããããšã«ãããããŒãã®è² è·ã調æ»ã§ããŸãã ããããå°æ¥çã«ã¯äŸ¿å©ã«ãªãã§ãããã
ãã©ãã£ãã¯ãšã³ããªã¯1è¡ãã€ã¿ã€ãã§ãã ä»ã®çš®é¡ã®ã¬ã³ãŒãããããããããŸãããããããã¯ç§ãã¡ã«ãšã£ãŠèå³æ·±ããã®ã§ã¯ãããŸããã é¢çšã«ã€ããŠã¯ãã¿ã€ãR200ã®ã¬ã³ãŒãã®ã¿ã§ååã§ãã ãããããã©ãã£ãã¯ã®èŠèŠçãªèª¿æ»äžã«ãå¥ã®èå³æ·±ãäºå®ãæããã«ãªããŸããã ã³ãŒã«ã¯ãåãçªå·ããéå§ãããåæã«éå§ãããããšããããŸãããé話æéã¯ç°ãªããŸããã æåã¯ãæ å ±ãäžå®å šãªç¶æ³ã§ãããçš®ã®ã°ãªããã ãšæã£ãã人ãåãçªå·ããåæã«é»è©±ããããããšã¯ã§ããªãããã ã ãã®åŸããã¿ãŒã³ãèŠãå§ããæçµçã«ãç§ã¯åé¡ãäœã§ããããç解ããŸããã 1ã€ã®é»è©±çªå·ã«å¯Ÿãããã®ãããªã¬ã³ãŒãã®äŸã次ã«ç€ºããŸããããããããããããã«ãäœåãªãã£ãŒã«ãã¯ãã¹ãŠæšãŠãŸããã
| 7 | 8 | 9 | 12 | 14 | 36 | | 3022 | 222222 | 333333 | 2011-05-23 13ïŒ07ïŒ54 | 2011-05-23 13ïŒ37ïŒ54 | 1800 | | 3022 | 222222 | 333333 | 2011-05-23 13ïŒ07ïŒ54 | 2011-05-23 13ïŒ59ïŒ40 | 3106 | | 3022 | 444444 | 555555 | 2011-05-23 14ïŒ53ïŒ52 | 2011-05-23 15ïŒ23ïŒ52 | 1800 | | 3022 | 444444 | 555555 | 2011-05-23 14ïŒ53ïŒ52 | 2011-05-23 15ïŒ53ïŒ52 | 3600 | | 3022 | 444444 | 555555 | 2011-05-23 14ïŒ53ïŒ52 | 2011-05-23 16ïŒ00ïŒ50 | 4018 | | 3022 | 666666 | 777777 | 2011-05-23 19ïŒ15ïŒ55 | 2011-05-23 19ïŒ45ïŒ54 | 1800 | | 3022 | 666666 | 777777 | 2011-05-23 19ïŒ15ïŒ55 | 2011-05-23 20ïŒ15ïŒ54 | 3600 | | 3022 | 666666 | 777777 | 2011-05-23 19ïŒ15ïŒ55 | 2011-05-23 20ïŒ45ïŒ54 | 5400 | | 3022 | 666666 | 777777 | 2011-05-23 19ïŒ15ïŒ55 | 2011-05-23 20ïŒ47ïŒ17 | 5483 |
å¡©ãäœã§ããããèŠãããšãã§ããããã«ãªã£ãåŸããããã®èšé²ãäœåãã®é¡äŒŒã®èšé²ã®äžãäœåãªãã£ãŒã«ããæåãæ°åã®äžããèŠã€ããã®ã¯ç°¡åã§ã¯ãããŸããã§ããã äžè¬çã«ãããã¯éãçŽèŠ³ããŸãã¯éæ³ã®ããããã§ããã :)ãããŠçãã¯ç°¡åã§ãã30åïŒ1800ç§ïŒããšã®æ©åšã¯ãäœããèµ·ãã£ãå Žåã«ãäŒè©±ã®ãã€ã«ã¹ããŒã³ããããŒã¯ããŸãã äŒè©±ã®æåŸã®29åãäœããã®åœ¢ã§å€±ããããšããŠããä¿¡é Œæ§ãé«ããããã«ãéå»3æéã®äŒè©±å šäœãäœåºŠãèšé²ãããŸããã æåŸã®ã¬ã³ãŒãã«ã¯ãå®éã®ããŒã¿ããããŸãã ãããããæ©åšã§ã¯ããã€ã«ã¹ããŒã³ã®æéãäœããã®æ¹æ³ã§å€æŽã§ããŸããããããŸã§ã®ãšããããã®æ°ã¯æ¬¡ã®ããã«ãªã£ãŠããŸãã [1800ã3600ã5400ã7200ã9000ã9000以äžã]çµæã¬ã³ãŒãã®ãã£ãŒã«ãã ãããããäžå¿ èŠãªãã®ãããè¯ãæ¹æ³ã§é€å€ããããã«ãå°æ¥ãããæ€èšãã䟡å€ããããããããŸããããä»ã®ãšããããã®ã·ãªãŒãºã®æéãæã€ãã¹ãŠã®ã¬ã³ãŒããåçŽã«ç Žæ£ããããšã«ããŸããã çè«çã«ã¯ãããã§ã¯éåžžã®é話ã®äžéšã倱ãããŸããããã®ããã«ã¯ã1ç§ã«æ£ç¢ºã«30åé話ãå¿ èŠããããŸãã ãã®ç¢ºçã¯éåžžã«å°ãããããªã¥ãŒã ã¯ããã»ã©å€§ãããªãã®ã§ã倧ããªæ°ã®æ³åãäœããã®åœ¢ã§ãµã³ãã«ã«åœ±é¿ãäžããŸãã ãã®çŸè±¡ãåµé çã«ã1800ç§ã®åé¡ããšåŒã³ãŸããã
ããã°ã©ã ã«ã€ããŠç°¡åã«
åèšã§ãå¿ èŠãªãã¡ã€ã«ãããŒãžããŠæçšãªæ å ±ãé€å€ãã4ã€ã®ããã°ã©ã ãäœæããŸããã æåã¯ãããŒãµãŒãšããŒãžã£ãŒã§ããã2ã€ã®ããã°ã©ã ã¯å¥ã ã«äœæãããããŒãžãšåŒã°ãã3çªç®ã®ããã°ã©ã ã«çµåãããŠããŸããã ãããã¯ãã¹ãŠéåžžã«ãã£ãããšåäœããå€ãã®ã¡ã¢ãªãæ¶è²»ããŸããããã¿ã¹ã¯ã«å¯ŸåŠããŸããã 500 MBã®ã¡ã¢ãªãæ¶è²»ãããŠããç¶æ ã§ïŒã¹ã¯ãããæ©èœãããããããã«10åéïŒ1ãæã®ããŒã¿ïŒ240è¡ã®3000ãã¡ã€ã«= 720000è¡ïŒãåŠçã§ããŸããã ãšãŠãããšãŠãæãçµæã§ãã ãŸããã¿ã¹ã¯ã¯æã«1åè¡ãå¿ èŠããããŸããããç§ã®ããŒãããŒã¯Haskellã軜ããŸããã 確ãã«ã Haskellã¯ãããšã¯äœã®é¢ä¿ããããŸããã ç§ã¯ããã°ã©ã ã§ãããåå¿è ã®æ©èœäž»çŸ©è ã®å€ãã®å žåçãªééãã«ããããããã¯æ²ãã£ãã¢ã«ãŽãªãºã ãéåžžã«ã²ã©ãããŸãæ©èœããªãã£ãããã§ããã ãããã圌ãã¯åããïŒ ããã«ïŒããã°ã©ã ïŒããã³ãããã®æ倧ã®ãã®ã¯ããã150ã®æçšãªè¡ãåãïŒã¯ãã³ãã³ãã©ã€ã³ããèšå®ããããšãã§ããŸãã å©çšå¯èœãªæ©èœã¯æ¬¡ã®ãšããã§ãã
1.ãã©ã¡ãŒã¿ãŒãªãã®ã¢ãŒãã§äœæ¥ããŸãã ããã©ã«ãã§ã¯ãã£ãŒã«ããååŸãããå æã®ãã¡ã€ã«ãååŸãããŸãã
2.ãã©ã¡ãŒã¿ãŒã䜿çšããã¢ãŒãã§äœæ¥ããŸãã
-ãã£ãŒã«ã[<ãã£ãŒã«ãã€ã³ããã¯ã¹ã®ãªã¹ã>]-ååŸãããã£ãŒã«ãïŒããŒãµãŒãã£ãŒã«ã[1ã24ã55]ïŒ;
-ïŒyyyyãmmïŒ-åŠçããæïŒå䜵ïŒ2011ã5ïŒïŒ;
-W-ïŒãåŸ æ©ããšããèšèããïŒã¯ãŒã¯ã¢ãŠãåŸã«ã³ã³ãœãŒã«ãŠã£ã³ããŠãéããªãã§ãã ããã
3.çµæã¯3ã€ã®ãã¡ã€ã«ã§ããã
-yyyy.mm.txt-ä»æã®çã®ãã©ãã£ãã¯ãæã€ãã¹ãŠã®ãã¡ã€ã«ãããŒãžãããŸããã
-processed.txt-ä»æã«å¿ èŠãªãã£ãŒã«ãã®ã¿ãå«ããã¡ã€ã«ã
-yyyy.mm.txt.log-çã®æªå å·¥ãã¡ã€ã«ããªã¹ããããèŠçŽæ å ±ãæžã蟌ãŸãããã°ãã¡ã€ã«ïŒè¡æ°ããã¡ã€ã«ãæ¥ä»ç¯å²ïŒã
4.ããã°ã©ã ã¯ãåŠçããããã©ãã£ãã¯ã®çµ±èšãšäŸã衚瀺ããŸãã
äœåã䜿çšããŸãããããã¡ãããããã°ã©ã ãæåããæžãçŽããŸããã å€ãã³ãŒãã«ã¯ãå€ãã®æ²ãã£ãã³ãŒããäžå¿ èŠãªèªè»¢è»ãæããªã¢ã«ãŽãªãºã ãå¥åŠãªè§£æ±ºçããããŸããã ãã®çµæãåãæ©èœãšåãããŒã¿ã»ãããæã€4çªç®ã®ããã°ã©ã NgnParserã¯10åéã§ã¯ãªã10ç§éåäœãã10 mbã®ã¡ã¢ãªããæ¶è²»ããŸããã é床ã§ã¯ãå·®ã¯ã»ãŒ2æ¡ã§ãå°ãªããšã1ã€ã¯ã¡ã¢ãªã«ãããŸãïŒ ããã°ã©ã ãé ããããããªæ··ä¹±ã¯äœã ã£ãã®ã§ããããïŒ ç§ãšåãçæãèžãã 人ããããšæããŸããæ²ãã£ãæãããèšèªã®é ããä¿¡ããŠãã人ããããšæããŸã-çç±ããªããçç±ããªãã€ã³ã¿ãŒãããäžã§éåžžã«å€ãã®æ²é³ŽããããŸã... Haskellã¯çŽ æŽãããèšèªã§ãã ãããã®ããã°ã©ã ãæžãã®ã¯ç°¡åã§ããã ããããã«ã€ããŠã2å¶æ¥æ¥ããããããŸããã§ããã ãããŠãç§ã¯å€ãã®åã³ãåŸããã³ã«ã Cã§åãããšãããå Žåãã©ãã»ã©ã®èŠçããããæ³åã§ããŸããã
æåã®ããã°ã©ã
æåã®ããã°ã©ã ã¯ç°¡åãªãã®ããå§ããŸããã ãšãããããã³ãã³ãã©ã€ã³ããŒã«ã䜿çšããŠå¿ èŠãªãã¡ã€ã«ã1ã€ïŒmerged.txtïŒã«ããŒãžããŸãããããŒãµãŒã®ã¿ã¹ã¯ã¯ããã©ãã£ãã¯ã解æããèå¥åR200ã§å¿ èŠãªã¬ã³ãŒããé€å€ããããšã§ãã 倧éã®ããã¹ããåŠçããã«ã¯ãç¹å¥ãªByteStringæåååã䜿çšããæ¹ã䟿å©ã§ãã ãã ããéåžžã®æåååã»ã©äŸ¿å©ã§ã¯ãããŸããã ByteStringãæååèªäœã®æé©åãããå®è£ ã§ããå Žåã Stringã¯æåã®ãªã¹ããã€ãŸã[Char]ã§ãã Stringã¯ãã®æ§è³ªäžéåžžã«äŸ¿å©ã§ãããããã°ããŒã¿ã§ã¯ãªã¹ãã®ããã©ãŒãã³ã¹ãå€§å¹ ã«äœäžããŸãã ããã°ã©ã ã®æåã®ããŒãžã§ã³ã§ã¯ã匷åãªãã¬ãŒããšå€§ããªã¡ã¢ãªã®ãããŒããåŒãèµ·ãããã®ã¯ã æååãšããã€ãã®æããªæ±ºå®ã§ããã ãããããã®åŸãçç£æ§ã§ã¯ãªããéçºã®é床ãå¿é ã«ãªããŸããã ããã°ã©ã ã®ãããã¿ã€ããéåžžã«è¿ éã«äœæããŸããã å€èŠ³ã¯æ¬¡ã®ãšããã§ãïŒãªããžã§ã³2ïŒïŒ
replaceChars :: Char- > Char- > Char- > Char
replaceChars whatC withC c = if c == whatC then withC else c
interestFields :: [ æåå ] -> [ Int ] -> [ æåå ]
interestFieldsã®takeWhat = undefined- ã¹ã¿ã
isR200 :: [ æåå ] -> Bool
isR200 s = ïŒ head s ïŒ == "R200"
processLine :: æåå -> æåå
processLine s = if isR200 sInWords then unwords ïŒ interestFields sInWords [1ã2ã3] ïŒ else [ ] -[1,2,3]-ãã£ãŒã«ãã®ãã¹ã
ããã§ã sInWords = words ïŒ map ïŒ replaceChars ' | ' '' ïŒ s ïŒ
processString :: æåå -> [ æåå ]
processString s = map processLine ïŒ lines $ s ïŒ
ã¡ã€ã³:: IO ïŒ ïŒ
ã¡ã€ã³= è¡ã
str < -readFile "merged.txt"
putStrLn ïŒæ¿å ¥" \ r \ n " ïŒ processString $ str ïŒ ïŒ
ã¿ã€ãChar- > Char- > Char- > Charã® replaceCharsãšããå¥åŠãªé¢æ°ã«ããã«æ°ä»ãããšãã§ããŸãã ã¢ã€ãã¢ã¯ããã§ããïŒã©ã€ã³ã¬ã³ãŒããåããåçŽããŒã|ãã眮ãæããŸã ã¹ããŒã¹ã䜿çšãã wordsé¢æ°ã䜿çšããŠæååãåèªã«åå²ããŸãã
sInWords = words ïŒ map ïŒ replaceChars ' | ' '' ïŒ s ïŒ
sInWordsãå®è¡ããçµæã次ã®å€æãåŸãããŸãã
"| R200 | 99999 | 111111 | CRãCSãAM | 1 | 1 | 3022 | 222222 | 333333 ||| 2011-06-23 11ïŒ33ïŒ58 |" ->
ãR200 99999 111111 CRãCSãAM 1 1 3022 222222 333333 2011-06-23 11:33:58ã ->
[ ãR200ã ã ã99999ã ã ã111111ã ã ãCRãCSãAMã ã ã1ã ã ã1ã ã ã3022ã ã ã222222ã ã ã333333ã ã ã2011-06-23ã ã ã 11:33:58 " ]
æ®å¿µãªãããæ¥æãã£ãŒã«ãã2ã€ã®å¥ã ã®ãã£ãŒã«ãã«åå²ãããŸãã åŸã§ããããåé¿ããããã«ãèšèšãããã«è€éã«ããæåã«ãã®ãã£ãŒã«ãã®ã¹ããŒã¹ãã¢ã¹ã¿ãªã¹ã¯ã«çœ®ãæããŠããè¿ããŸãã ãã®çµæãã©ã€ã³ã¬ã³ãŒãã¯ããã«å€ãã®å€æãçµãŸããã
眮æ ''-> '*';
ã|ãã眮ãæãã -> '';
åèªæ©èœã«ããåèªåå²ã
ãã£ãŒã«ãã®ãªã¹ããåŠçããç®çã®ã€ã³ããã¯ã¹ãæã€ãã£ãŒã«ããååŸããŸãã
unwordsé¢æ°ã䜿çšããŠãã£ãŒã«ããããŒãžããŸãã
眮æ ''-> '|'
眮æ '*'-> ''
ããã«ããããã®ã²ã©ãå€æã®åŸãåä¿¡ãããã£ãŒã«ãã®æ°ã¯ãœãŒã¹ãã£ãŒã«ãã®æ°ãšäžèŽããŸããã§ããã空ã®ãã£ãŒã«ããæçµçã«å®å šã«æ¶ããããã§ãïŒäžèšã®å€æäŸãåç §ïŒã ãã¹ãŠã®ã¬ã³ãŒãã§ã空ã®ãã£ãŒã«ããŸãã¯å¡ãã€ã¶ããããã£ãŒã«ããåãå Žæã«ãããšäŸ¿å©ã§ããããããªããšãäžå¿«ãªã¢ãŒãã£ãã¡ã¯ããçºçããŸãã ã芧ã®ãšãããã³ãŒãã¯åé·ã§ããã ãã§ãªããèŠèŠãããã®ã§ãã ç§ã¯ãã®æŒžè¿çãªè€éããè©äŸ¡ããããšããæ³å®ããŠããŸããã 圌女ã¯OïŒn ^ 2ïŒãã¯ããã«è¶ ããŠãããšæããŸãã ããã«ããªããžã§ã³12ã«è¿ã¥ããšãäºéã®çžŠç·ãåå ã§å€±ããããã£ãŒã«ãã«å¯ŸããŠäœããè¡ãå¿ èŠãããããšã«æ°ä»ããŸããã ãããŠå¥ã®å€æãè¿œå ããŸããïŒ
-ã||ããšããŒã¯ããã空ã®ãã£ãŒã«ããæ£ããåŠçãããããã«ããããã®éã«ã¹ããŒã¹ãæ¿å ¥ãããŸãã
refieldDoubles :: æåå -> æåå
refieldDoubles [ ] = [ ]
refieldDoubles ïŒ ' | 'ïŒ [ ] ïŒ = "|"
refieldDoubles ïŒ ' | 'ïŒ ' | 'ïŒss ïŒ = "| |" ++ ïŒ refieldDoubles ïŒ ' | 'ïŒss ïŒ ïŒ
refieldDoubles ïŒ sïŒ [ ] ïŒ = [ s ]
refieldDoubles ïŒ sïŒss ïŒ = sïŒ ïŒ refieldDoubles ss ïŒ
ãããã£ãŠãåè¡ã«å¥ã®å®å šãªããã»ãŒãžãè¿œå ããŸããïŒ ãŸããçå®-ç¿ã®åŽåã ãã ããããªãã®äœæ¥ãè¡ãå¿ èŠããããŸããã 代ããã«Data.String.Utilsã¢ãžã¥ãŒã«ã®splité¢æ°ã䜿çšããããç¬èªã®ããŒãžã§ã³ãäœæããŸãã 次ã«ãã¬ã³ãŒãè¡ã«æ²¿ã£ãŠ1åãã¹ããã ãã§ãæ£ãããã£ãŒã«ãã®å èš³ãååŸã§ããŸãã
ã|ããåå²ããŸã "| R200 | 99999 | 111111 | CRãCSãAM | 1 | 1 | 3022 | 222222 | 333333 ||| 2011-06-23 11ïŒ33ïŒ58 |" ->
[ "" ã "R200" ã "99999" ã "111111" ã "CRãCSãAM" ã "1" ã "1" ã "3022" ã "222222" ã "333333" ã "" ã "" ã "2011-06-23 11:33:58" ã "" ]
ç§ã¯äœãèšãããšãã§ããŸã...
ã©ã®ãããªæ¹åãå¯èœã§ãã
çµéšè±å¯ãªHaskellistsã¯ãã³ãŒããã°ãã°ãã®ã¹ã¿ã€ã«ã䜿çšããŠããªãããšã«ãã§ã«æ°ã¥ããŠããïŒãã®æç¹ã§ã¯ãŸã æããŠããŸããã§ããïŒãã±ãŒã¹ã®æ§ç¯ããµã³ãã«ãšã®æ¯èŒããŸãã¯ããããçš®é¡ã®ã»ãã¥ãªãã£è¡šçŸã¯ã»ãšãã©ãããŸããã çµæãšããŠããã®ãããªåçŽãªã³ãŒãã§ãããå Žæã§èªãããšã¯å°é£ã§ãã ããã€ãã®é¢æ°ãæžãçããããè¯ãæ¹æ³ã¯æ¬¡ã®ãšããã§ãã
replaceSymbols s = map ïŒ replaceChar ' | ' '' ïŒ ïŒ map ïŒ replaceChar '' ' * ' ïŒ s ïŒ
-->
replaceSymbols = map ïŒ replaceChar ' | ' ''ãreplaceChar '' ' * ' ïŒ
isR200 s = ïŒ head s ïŒ == "R200"
-->
isR200 ïŒ "R200" ïŒ _ ïŒ = True
isR200 _ = False
replaceChars whatC withC c = if c == whatC then withC else c
-->
replaceChars whatC withC c | c == whatC = withC
| ãã以å€ã®å Žå = c
processLine s = if isR200 sInWords then unwords ïŒ interestFields sInWords [ 1ã2ã3 ] ïŒ else [ ]
ããã§ã sInWords = words ïŒ map ïŒ replaceChars ' | ' '' ïŒ s ïŒ
-->
processLine s | isR200 sInWords = unwords ïŒ interestFields sInWords [ 1ã2ã3 ] ïŒ
| ãã以å€ã®å Žå = [ ]
ããã§ã sInWords = words ã map ïŒ replaceChars ' | ' '' ïŒ $ s
processString s = map processLine ïŒ lines $ s ïŒ
-->
processString = map processLine ã è¡
éåžžã ã€ã³ã¿ãŒã«ã¬ãŒãé¢æ°"\ r \ n"ã¯unlinesã«çœ®ãæããå¿ èŠããããŸããã ããçããããæ確ã«ãªãããã¹ãã§ã¯ã unlinesã¯åªããããã©ãŒãã³ã¹ã瀺ããŸãã-å°ãªããšã30ïŒ ïŒ
ItemsCnt testUnlinesïŒnsïŒtestIntercalateïŒnsïŒããŒã»ã³ã 10 23.84 34.05 29.9 100 22.70 34.62 34.4 1000 23.28 35.48 34.3 10000 22.17 35.48 37.5 50,000 22.13 33.26 33.4 100000 21.06 35.47 40.6 200000 22.70 34.05 33.3
ãããããŸã çµéšã®æµ ãéãç§ã¯äžèŠãªèªè»¢è»ããããã¯ããããã ãã¬ãªã¥ãŒãã¢ãžã¥ãŒã«ããã§ãæšæºæ©èœãç¥ããŸããã§ããã ãã ããä»ã§ããæå°éã®åŽåã§ãèŠçŽ ã®ãªã¹ãããç®çã®ã€ã³ããã¯ã¹ãæã€èŠçŽ ãéžæããæ¹æ³ãå®éã«ã¯ç解ããŠããŸããã å€ãããã°ã©ã ãšæ°ããããã°ã©ã ã®ã³ãŒããæ¯èŒããŸãã
-å€ãã³ãŒãïŒ
-åŒæ°1-çã®é£åã®ãªã¹ã
-åŒæ°2-å¿ èŠãªã€ã³ããã¯ã¹ã®ãªã¹ã
takeInterest :: [ æåå ] -> [ Int ] -> [ æåå ]
takeInterest _ [ ] = [ ]
takeInterest ss ïŒ nïŒns ïŒ = [ ss !! n ] ++ takeInterest ss ns
-æ°ããã³ãŒãïŒ
-åŒæ°1-ããããªãŒ
-åŒæ°2-å¿ èŠãªã€ã³ããã¯ã¹ã®ãªã¹ã
-åŒæ°3-çãã£ãŒã«ãã®ãªã¹ã
collectFields :: Int- > [ Int ] -> [ æåå ] -> [ æåå ]
collectFields _ _ [ ] = [ ]
collectFields idx fis ïŒ sïŒss ïŒ | idx ` elem` fis = sïŒcollectFields ïŒ idx + 1 ïŒ fis ss
collectFields idx fis ïŒ sïŒss ïŒ | ãã以å€ã®å Žå = collectFields ïŒ idx + 1 ïŒ fis ss
æåã®ã±ãŒã¹ã§ã¯ãã€ã³ããã¯ã¹ã®ãªã¹ããå埩åŠçããå®å šã§ãªãé¢æ°ã䜿çšããŠèŠçŽ ãåŒãåºããŸã!! ã 2çªç®ã®ã±ãŒã¹ã§ã¯ãããããªãŒã䜿çšããŠãã£ãŒã«ãã®ãªã¹ããç¹°ãè¿ãåŠçããã€ã³ããã¯ã¹ã®ãªã¹ãã§ããããªãŒãèŠã€ãã£ãå Žåãã³ã¬ã¯ã·ã§ã³ã®ããããªãŒã€ã³ããã¯ã¹ã§çŸåšã®ãã£ãŒã«ããååŸããŸãã ãããšæ«å°Ÿã®ååž°ããããŸãã ãã ãããã¹ãã«ãããšãæ°ããã³ãŒãã¯40ïŒ é ããªããŸããã ãããããã®å Žåãå€ãã³ãŒããè¿ã䟡å€ããããŸããæ°ããããã°ã©ã ãããã«é«éåããããã§ãã
ItemsCnt takeInterestïŒnsïŒcollectFieldsïŒnsïŒããŒã»ã³ã 10 17.33 36.84 52.9 100 20.58 36.84 44.1 1000 21.67 37.92 42.8 10000 21.13 36.84 42.6 50,000 21.67 37.92 42.8
é²ã
次ã®ããã°ã©ã ã§ããå䜵ã¯ãå æã®ãã¹ãŠã®ããã¹ããã¡ã€ã«ã1ã€ã«çµåããããšã«ãªã£ãŠããŸãã ïŒæ¯åæåã§ããããã¯ãããŸããã§ããããåç¥ã®ããã«ãæ lazã¯é²æ©ã®åååã§ããïŒè³ªåãçºçããŸããïŒå æã®äºå®ãã©ããã£ãŠç¥ãã®ã§ããïŒ ã¯ããäžè¬çã«ã¯ç°¡åã§ããçŸåšã®æ¥ä»ãååŸããŠ1ãæãå·®ãåŒããŸãã ãã®ããã°ã©ã ã¯æã®åãã«ã®ã¿äœ¿çšãããããšã«ãªã£ãŠãããããåé¡ã¯äºæ³ãããŸããã§ããã çŸåšã®æ¥ä»ãšãäžè¬ã«æ¥ä»ãšæå»ã®æäœã¯ã æéã¢ãžã¥ãŒã«ã«ãããŸãã ãã¡ã€ã«ã·ã¹ãã æ§é ã®æäœã¯ã System.Directoryã¢ãžã¥ãŒã«ã«ãããŸãã ã©ã¡ãã®é¢æ°ãäž»ã«IOã¢ããã§æ©èœããŸããããã®æç¹ã§ã¯ãŸã ã¢ããã³ãŒããçµã¿åãããæ¹æ³ãå®éã«ã¯ç¥ããŸããã§ããããæçµçã«ã¯äžæ°å³ã«èŠããŸãïŒããŒãžããªããžã§ã³14ïŒã
ã¡ã€ã³:: IO ïŒ ïŒ
ã¡ã€ã³= è¡ã
args < -getArgs
curDir < -getCurrentDirectory
dirContents < -getDirectoryContents curDir
curTime < -T. getClockTime
monthAgoTime <- $ Tãè¿ããŸã ã addToClockTime ïŒ T. TimeDiff 0 ïŒ -1 ïŒ 0 0 0 0 0 ïŒ curTime
calendarMonthAgoTime < -T. toCalendarTime monthAgoTime
å€åDateRange = case args
ïŒ aïŒbïŒ _ ïŒ -> readDateRange ïŒ unwords [ a ã b ] ïŒ
_- >ã¡ããã©$ defaultDateRange calendarMonthAgoTime
ã±ãŒã¹ maybeDateRange of
ãã dr- > do
let fsToMerge = filesToMerge dirContents dr
let fsToMergeCountStr = $ length fsToMergeã衚瀺
let mergeLog = ïŒ newFileName dr ++ ".log" ïŒ
dateRangeMsg = "DateRangeïŒ" ++ã« drã衚瀺 ãããŸã
fsContents < -merge fsToMerge
writeFile ïŒ newFileName dr ïŒ ïŒ fsContentsã®å±éïŒ
writeFile mergeLog ïŒ fsToMerge ++ printfã®ã€ã³ã©ã€ã³åã解é€ããŸã \ n ïŒ s \ nåèšãã¡ã€ã«ïŒïŒ s " dateRangeMsg fsToMergeCountStr ïŒ
putStrLn ïŒ fsContentsã®ã€ã³ã©ã€ã³åã解é€ïŒ
putStrLn dateRangeMsg
--putStrLnïŒ "ããŒãžãããã¡ã€ã«ïŒ" ++ fsToMergeã®ã€ã³ã©ã€ã³å±éã解é€ïŒ
putStrLn ïŒ printf "ãã¡ã€ã«ã®æ°ïŒïŒ sããã¡ã€ã«ãªã¹ãã«ã€ããŠã¯ïŒ sãåç §ããŠãã ããã" fsToMergeCountStr mergeLog ïŒ
äœããªã-> putStrLn ïŒ "ç¡å¹ãªæ¥ä»ç¯å²ã" ïŒ
ãã®ã³ãŒããäœãããã®ããç§ãããã«å ¥ãããšã¯ãå§ãããŸãã...ããããå€ãããã°ã©ã ã®ææ°ããŒãžã§ã³ãèšå€§ãªéã®ã¡ã¢ãªãé£ã蟌ãã ãããå°æ¥ã®å·šå€§ãªãšã©ãŒã®èœãå¿ã³èŸŒãã ã®ã¯ããã§ãã ãã®ã³ãŒãããåŒã³åºãããããŒãžé¢æ°ãèããŠã¿ãŸãããã
merge :: [ æåå ] -> IO [ æåå ]
merge fsToMerge = mapM readFile fsToMerge
å¶åŸ¡ãããã¡ã€ã«ã®ãªã¹ããåãåããããããèªã¿åãããã®å 容ã®ãªã¹ããè¿ããŸãã ã³ãŒãã«ã¯æ¬¡ã®2è¡ããããŸãã
ãã
...
fsContents < -merge fsToMerge
writeFile ïŒ newFileName dr ïŒ ïŒ fsContentsã®å±éïŒ
...
éèŠãªç¹ã¯ã fsContentsã®ã€ã³ã©ã€ã³å±éã§ãã ã€ãŸãããã¹ãŠã®ãã¡ã€ã«ã®ãã¹ãŠã®çã®ã³ã³ãã³ãã1åã«ãŸãšããããçµæãã¡ã€ã«ã«è©°ã蟌ãŸããŸããã åŸã«ãããŒãµãŒãšå䜵ãçµã¿åãããããšããããŒãµãŒããŒãã®åŠçã«è»¢éãããã®ã¯ãã®èšå€§ãªéã®ããŒã¿ã§ãããèŠããŠããã®ã¯ã倧éã®çœ®æããã¹ããã®ä»ã®ãªãŒããŒããããããããšã§ãã ããŒãµãŒãšããŒãžããã³ã³ãã€ã«ãããå€ãããã°ã©ã ã§ã¯ããã®ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
ãã
...
fsContents < -readFilesToMerge fsToMerge
let mergedContents = fsContentsã®ã©ã€ã³ã解é€ããŸã
writeFile ïŒ newFileName dr ïŒ mergedContents
let writtenContentStr = unlines $ processData nedeedFields mergedContents
...
ãããŠãããã¯åã«
ã¹ããŒã 1 _____ _____ _____ | | | | | | A1-> | FïŒA1ïŒ| -> B1-> | GïŒB1ïŒ| -> C1-> | HïŒC1ïŒ| ->çµæ1->ä¿å | _____ | | _____ | | _____ | _____ _____ _____ | | | | | | A2-> | FïŒA2ïŒ| -> B2-> | GïŒB2ïŒ| -> C2-> | HïŒC2ïŒ| ->çµæ2->ä¿å | _____ | | _____ | | _____ | _____ _____ _____ | | | | | | A3-> | FïŒA3ïŒ| -> B3-> | GïŒB3ïŒ| -> C3-> | HïŒC3ïŒ| ->çµæ3->ä¿å | _____ | | _____ | | _____ | ...-> ...-> ...-> ...-> ...-> ...->çµæn->ä¿å
ãããŠãããã¯æ¬¡ã®ããã«ãªããŸããïŒ
ã¹ããŒã 2 ____________________ ____________________ ____________________ | | | | | | | | | | | | | | | | | | A-> | FïŒAïŒ|-> B-> | GïŒBïŒ|-> C-> | HïŒCïŒ|->çµæ->ä¿å | | | | | | | | | | | | | ____________________ | | ____________________ | | ____________________ |
éšåã®é 次åŠçãšãã¹ãŠã®åŠçã®éããããã«æããŸããã ä»ãç§ã¯ç¥ã£ãŠããŸãïŒäžåºŠã«ãã¹ãŠã®äœæ¥ãè¡ã䟡å€ã¯ãããŸãããããŒã¿ããããã§çºè¡ããã¡ã«ããºã ãäœæããæ¹ãããã§ããããã¡ã¢ãªå ã§å¹æçãã€é«éã«ãªããŸãã ãããŠãä»ã®ãã¹ãŠã«å ããŠã2çªç®ã®ã¹ããŒã ã«åŸã£ãŠäœæãããããã°ã©ã ã¯äžŠååã§ããŸããã ãã©ãŒãäžèšã§èšãã°...
åŸã§ãã»ãšãã©ãã¹ãŠã®å Žæã§StringãByteStringã«çœ®ãæããŠãå€ãããã°ã©ã ãæé©åããããšããŸããã ãã¡ãããã²ã€ã³ã¯ãããã§ããããé§ã®ãã¡ã³ãåæ£ãããããšã¯ã§ããŸããã
èšããŸã§ããªããç§ã¯æ°ããããã°ã©ã ã§ããNgnTrafficãäœæããŸãããNgnTrafficã¯ãã§ã«éåžžã®ç¥èãæã£ãŠããŸããïŒ å€ãã®ããšã芳å¯ãããŠããŸãã ããã°ã©ã ã¯ã Main ã Constants ã DataProcess ã FileListProces ã Options ã Tools ã Typesã®ã¢ãžã¥ãŒã«ã«åãããŠããŸãã ãã¡ãããã¹ããŒã 1ã䜿çšããã æååã®ä»£ããã«ã ByteStringåïŒå³å¯ãªããªã¢ã³ãïŒãæåã«äœ¿çšãããŸããã ã³ãŒãã¯ãæéãããããªãã¹ã¿ã€ã«ã§ãããããã³ãŒãã³ã°ãããŠããŸãã ãããŠãæãéèŠãªããšã¯ãè¡åã®ååãå€ãã£ãããšã§ãã æåã«ãåŠçããããã¡ã€ã«ã®ãªã¹ããåéãããŸã-ãã®éšåã¯ãå€ãããã°ã©ã ã®é¡äŒŒéšåã«äŒŒãŠããŸãã ãã ãããã¡ã€ã«ã¯äžåºŠã«1ã€ã®å€§ããªå€æ°ã«èªã¿èŸŒãŸããã®ã§ã¯ãªããããããåå¥ã«èªã¿èŸŒãŸããŸãã ãã®å 容ã¯ããã«åŠçãããè¡ã解æãããã¬ã³ãŒãããã£ã«ã¿ãªã³ã°ãããå¿ èŠãªãã£ãŒã«ããåãåºãããŸãã çµæã¯çµæãã¡ã€ã«ã«è¿œå ãããŸãã ãã®çµæãããã£ã¹ã¯ããã®èªã¿åãïŒ FïŒAnïŒ ïŒ-æååã®åŠçïŒ GïŒBnïŒ ïŒ-ãã£ã¹ã¯ãžã®çµæã®æžã蟌ã¿ïŒ HïŒCnïŒ ïŒããšãããµã€ã¯ã«ãããããã¡ã€ã«ã®æ°ãéåžžã«å€ããªããŸãã ããã«ããã¡ãããããæåãå¥ã®æåã«çœ®ãæããããšã¯ãããŸãããã Data.ByteString.Char8ã¢ãžã¥ãŒã«ã®åçŽãªåå²é¢æ°ããããŸããããã¯ãã¬ã³ãŒãæååã1ã€ã®ãã¹ã§ãã£ãŒã«ãã«åå²ããããèªäœãããã©ãŒãã³ã¹ã®éæ¹ããªãã·ã§ã¢ãç²åŸããŸãã ã¹ããŒã 1ãæºããé¢æ°ã¯æ¬¡ã®ãšããã§ãã
ããã»ã¹ ' :: ResFilePath- > FieldIndexes- > FilePath- > IO ïŒ ïŒ
ããã»ã¹ã®resFile fis targetFile = do
fileContents < -C. readFile targetFile
let processResult = processData fisè¿°èªfileContents
C. appendFile resFile processResult
ããã»ã¹:: ResFilePath- > [ FilePath ] -> FieldIndexes- > IO String
process _ [ ] _ = ãåŠçãããã¡ã€ã«ããããŸãããã è¿ã
ããã»ã¹resFile fs fieldIndexes = do
C. writeFile resFileC ã 空ã£ãœ
mapM_ ïŒããã»ã¹ã®resFile fieldIndexes ïŒ fs
ããã¹ãŠOKãã è¿ã ãŸã
ããã§ãprocessã¯çµæãã¡ã€ã«ã®ååãåŠçãããã¡ã€ã«ã®ãªã¹ããããã³å¿ é ãã£ãŒã«ãã®ã€ã³ããã¯ã¹ãåããŸãã ã€ã³ããã¯ã¹ã¯ã³ãã³ãã©ã€ã³ããååŸã§ããããããã®é¢æ°ã®åŒæ°ãšããŠåºåãããŸãã processã¯ãåãã¡ã€ã«åãé çªã«ååŸããé¢æ°process 'ãé©çšããŸãïŒè¡mapM_ïŒprocess' resFile fieldIndexesïŒfs ïŒã 圌女ã¯ãã§ã«ãã¡ã€ã«ã®äž»ãªä»äºãããŠããŸãã processDataé¢æ°ã¯ããã¡ã€ã«ã®ã³ã³ãã³ãã®åŠçãè¡ããŸãã R200ã¬ã³ãŒãã®ãã£ã«ã¿ãªã³ã°ã«å ããŠãæ°ããããã°ã©ã ã§è¿°èªã¡ã«ããºã ãäœæãããããšã¯èå³æ·±ãããšã§ããã©ã®ã¬ã³ãŒããå©çšå¯èœãªè¿°èªãšç §åã§ããè¿°èªèªäœã«å¿ èŠãªãã®ãç°¡åã«è¿œå ã§ããŸãã ãããŸã§ã«2ã€ã®ããšãè¡ãããŸãããã€ã³ããã¯ã¹xã®ãã£ãŒã«ãã¯ããã£ãŒã«ãã®ãªã¹ãã«å±ãããã®ãªã¹ãã«å±ããŠããŸããã ããã¯ãè¿°éšã®ã¿ã€ãã§ãã
ããŒã¿è¿°èª= NotInList [ C. ByteString ]
| InList [ C. ByteString ]
ã¿ã€ã PredicateMap = [ ïŒ FieldIndex ã Predicate ïŒ ]
ãããŠããããã¯äžããããå®æ°è¿°èªã§ãïŒ
è¿°èª:: PredicateMap
è¿°èª= [ ïŒ 1 ã InList [ C. pack "R200" ] ïŒ ã
ïŒ 36 ã NotInList ïŒ map C. pack [ "1800" ã "3600" ã "5400" ã "7200" ã "9000" ã "10800" ã "12600" ã "14400" ã "16200" ã "18000" ã ã19800ã ã ã21600ã ã ã23400ã ] ïŒ ïŒ ]
ãã£ãŒã«ã1ããR200ãã«çããããã£ãŒã«ã36ããåé¡1800ç§ãã®ãªã¹ãã«ãªãã¬ã³ãŒãã®ã¿ãè¿°èªãæºãããšæšæž¬ããã®ã¯ç°¡åã§ãã ã¹ã¯ãªãŒãã³ã°ã¯checkPredicateããã³examineFieldsé¢æ°ã§çºçããŸã ã
checkPredicate ::è¿°èª-> C ByteString- > Bool
checkPredicate ïŒ NotInList l ïŒ str = ïŒ notãelem str ïŒ l
checkPredicate ïŒ InList l ïŒ str = elem str l
examineFields :: Int- > PredicateMap- >ãã£ãŒã«ã-> Bool
examineFields _ _ [ ] = True
examineFields idx preds ïŒ sïŒss ïŒ = case L. ã«ãã¯ã¢ãã IDX
ã¡ããã©pred -> ïŒ checkPredicate pred s ïŒ && ïŒ examineFields ïŒ idx + 1 ïŒ preds ss ïŒ
ãªã-> examineFields ïŒ idx + 1 ïŒ preds ss
examineFieldsé¢æ°ã¯foldrãä»ããŠå®è¡ã§ããããšãããããŸããããããã¯ããããªããšã§ãã
äžè¬çã«ãå®äºããäœæ¥ã«æºè¶³ããŠããŸãã ããã¯ãŸãã§ã-ããããç§ã¯NgnTrafficã³ãŒãã奜ãã§ãã ãããŠãç§ã¯ç¹ã«ãç°ãªãããã°ã©ã ã§ãç°ãªãæéã«ãç°ãªãç¥èã§æžãããåãããã°ã©ã ã®äŸã§ç®ã«èŠããããã«ãªã£ãé²æ©ã奜ãã§ãã ãããã«ç¹å¥ãªãç§ã¯ããããå®éã®çç£ã§äœ¿çšãããHaskellã®å®éã®ããã°ã©ã ã§ãããšããäºå®ã奜ãã§ãã
圌ããäœãšèšã£ãŠãã Haskellã¯çŽ æŽãããèšèªã§ãããç§ããããŸã§åããäžã§æé«ã®ãã®ã§ãã
ãªããžã§ã³ã®ããŒãµãŒãœãŒã¹ïŒ [2] ã [6] ã [12]
å䜵ã®ãœãŒã¹ïŒå䜵統åããã°ã©ã ãå«ãïŒïŒ [13] ã [14] ã [16] ã [23]
NgnTrafficã®ãœãŒã¹
PS Yet Another Monad Tutorialã®æ¬¡ã®éšåã®ç¿»èš³ãè¿æ¥äžã«å©çšå¯èœã«ãªããŸãã
PPSåå¿steckã®ãããã§ããã°ã©ã ãžã®ãªã³ã¯ãä¿®æ£ãããŸãã ã
PPPSåå¿ã®goderãšjack128ã®ãããã§ãããã€ãã®ãšã©ãŒãä¿®æ£ããŸãã ã