using System; using System.Collections.Generic; using System.Linq; using System.IO; using System.Text.RegularExpressions; namespace NewsCrawler { public class CodeList { public enum CODE_TYPE { NONE = 0, ORIGINAL = NONE, DENIAL = 1<<0, DUPLICATED = 1<<1, MANUAL = 1<<2, } public class CODE_VALUE { public CODE_TYPE m_enType; public string m_strCode; public string m_strName; override public string ToString() { return string.Format("{0}:{1}", m_strCode, m_strName); } } class SYNONYM_VALUE { public string m_strCode; public string m_strName; } CPUTILLib.CpStockCode m_StockCode = new CPUTILLib.CpStockCode(); List m_CodeList = new List(); List m_SynonymList = new List(); public CodeList() { MakeList(); LoadSynonym(); LoadManualList(); LoadDenialList(); LoadDuplicatedList(); Test(); } void Test() { if(Util.IsDebugging() == false) return; Console.WriteLine("Code Search Test"); Console.WriteLine(SearchCode("[fnRASSI]씨트리(047920) 전일대비 6.77% 상승")); Console.WriteLine(SearchCode("[클릭 e종목]로엔, 본격적으로 시작되는 카카오 시너")); Console.WriteLine(SearchCode("[클릭 e종목]\"SK텔레콤, 투자심리 개선 가능성 주목해")); Console.WriteLine(SearchCode("[클릭 e종목]SK하이닉스, 추가 상승 낙관적")); Console.WriteLine(SearchCode("MBK, 45억 규모 유상증자 결정")); Console.WriteLine(SearchCode("다음주 코스피 1960~1990…산유량 감산여부에 주목")); Console.WriteLine(SearchCode("\"사세요 일색 보고서\" 증권사 투자등급 공시 '")); Console.WriteLine(SearchCode("허서홍 GS에너지 상무, GS 보통주 5.1만주 매수")); Console.WriteLine(SearchCode("엠씨넥스, 아이클론 프리미엄 블랙박스 'i5 W")); Console.WriteLine(SearchCode("에스아이티글로벌, 김의서 대표이사 체제로 변")); Console.WriteLine(SearchCode("시몬스침대, 일산 가구공단에 프리미엄 매장 오")); Console.WriteLine(SearchCode("[유럽증시]美 고용지표 앞두고 짙은 관망세")); Console.WriteLine(SearchCode("코스콤, 강신 신임 전무이사 선임")); Console.WriteLine(SearchCode("[베스트리포트]원자현미경, 반도체의 질문에 답")); Console.WriteLine(SearchCode("거래소, 인콘에 최대주주 지분매각 추진설 조회")); Console.WriteLine(SearchCode("와이제이엠게임즈, 서울 강남구로 본점 이전")); Console.WriteLine(SearchCode("[특징주] 에이치엘비-생명, 아파티닙 글로벌 임상 3상 최종 승인 소식에 상승세")); Console.WriteLine(SearchCode("진도군, 112건의 계약심사 통해 예산 10억원 절감")); Console.WriteLine(SearchCode("[특징주] 브레인콘텐츠, 삼성전자 폴더블폰")); Console.WriteLine(SearchCode("[아시아경제] 큐젠바이오텍, 미국 지사 설립 추진")); Console.WriteLine("Test End"); } void MakeList() { CPUTILLib.CpCodeMgr CodeMgr = new CPUTILLib.CpCodeMgr(); int iCnt = m_StockCode.GetCount(); for(short i = 0; i b.m_strName.Length-a.m_strName.Length); } void LoadCodeType(string strPath, CODE_TYPE enType) { m_CodeList.ForEach(a => a.m_enType &= ~enType); if(File.Exists(strPath) == false) return; string[] aLines = File.ReadAllLines(strPath); foreach(string strLine in aLines) { if(strLine.Trim().Length <= 0) continue; CODE_VALUE code = m_CodeList.Find(s => s.m_strName == strLine.Trim()); if(code == null) { SYNONYM_VALUE Synonym = m_SynonymList.Find(s => s.m_strName == strLine); if (Synonym != null) { code = m_CodeList.Find(s => s.m_strCode == Synonym.m_strCode); } else { Util.Log(Util.LOG_TYPE.ERROR, string.Format("[code-{0}] 존재하지 않는 기업명입니다. ({1})", enType.ToString().ToLower(), strLine)); continue; } } code.m_enType |= enType; } } public void LoadManualList() { string strPath = Util.GetConfigPath()+"/code-manual.txt"; LoadCodeType(strPath, CODE_TYPE.MANUAL); } public void LoadDenialList() { string strPath = Util.GetConfigPath()+"/code-deny.txt"; LoadCodeType(strPath, CODE_TYPE.DENIAL); } public void LoadDuplicatedList() { string strPath = Util.GetConfigPath()+"/code-duplicated.txt"; LoadCodeType(strPath, CODE_TYPE.DUPLICATED); } public bool IsBuyableCode(CODE_VALUE Code) { return ((Code.m_enType & CODE_TYPE.DENIAL) | (Code.m_enType & CODE_TYPE.DUPLICATED)) == CODE_TYPE.NONE; } public void AddDuplicatedList(string strCode, string strName) { CODE_VALUE Result = m_CodeList.Find(s => s.m_strCode == strCode); if(Result == null) return; if((Result.m_enType & CODE_TYPE.DUPLICATED) == CODE_TYPE.DUPLICATED) return; Result.m_enType |= CODE_TYPE.DUPLICATED; string strPath = Util.GetConfigPath()+"/code-duplicated.txt"; File.AppendAllText(strPath, strName+Environment.NewLine); } public void MakeManualList(int iPrice) { m_CodeList.ForEach(a => a.m_enType &= ~CODE_TYPE.MANUAL); List ReqList = new List(); int iCnt = 0; string strCodes = ""; foreach(CODE_VALUE code in m_CodeList) { if(code.m_enType == CODE_TYPE.ORIGINAL) { strCodes += code.m_strCode; iCnt++; } if(iCnt >= 110) { ReqList.Add(strCodes); strCodes = ""; iCnt=0; } } if(iCnt > 0) { ReqList.Add(strCodes); strCodes = ""; iCnt=0; } DSCBO1Lib.StockMstm stockMstM = new DSCBO1Lib.StockMstm(); foreach(string codelist in ReqList) { stockMstM.SetInputValue(0, codelist); stockMstM.BlockRequest2(0); int iReturnCnt = stockMstM.GetHeaderValue(0); for(int i = 0; i= iPrice) { string strCode = stockMstM.GetDataValue(0, i); m_CodeList.FindAll(s => s.m_strCode == strCode).ForEach(s => s.m_enType |= CODE_TYPE.MANUAL); } } } string strContents = ""; m_CodeList.FindAll(s => (s.m_enType & CODE_TYPE.MANUAL) == CODE_TYPE.MANUAL) .ForEach(s => strContents += (s.m_strName+Environment.NewLine)); string strPath = Util.GetConfigPath() + "/code-manual.txt"; File.WriteAllText(strPath, strContents, new System.Text.UTF8Encoding(true)); } public void LoadSynonym() { string strPath = Util.GetConfigPath() + "/code-synonym.txt"; if(File.Exists(strPath) == true) { string[] aLines = File.ReadAllLines(strPath); foreach(string line in aLines) { string[] aTokens = line.Trim().Split('='); if(aTokens != null && aTokens.Length == 2) { string strSysnonym = aTokens[0].Trim(); string strOrg = aTokens[1].Trim(); CODE_VALUE Result = m_CodeList.Find(s => s.m_strName==strOrg); if(Result == null) { Util.Log(Util.LOG_TYPE.ERROR, string.Format("[code-synonym] 존재하지 않는 기업명입니다. ({0})", strOrg)); continue; } SYNONYM_VALUE Code = new SYNONYM_VALUE(); Code.m_strCode = Result.m_strCode; Code.m_strName = strSysnonym; m_SynonymList.Add(Code); } } m_SynonymList.Sort((a, b) => b.m_strName.Length-a.m_strName.Length); } } public CODE_VALUE SearchCode(string strText) { try { string strReplace = Regex.Replace(strText, @"(\[).*(\])", ""); strReplace = Regex.Replace(strReplace, @"(\().*(\))", ""); strReplace = Regex.Replace(strReplace, @"(\<).*(\>)", ""); string[] words = strReplace.Trim().Split(' ', ','); string strCodeWord = words[0]; CODE_VALUE Result = m_CodeList.Find(s => (s.m_strName == strCodeWord)); if(Result != null) return Result; SYNONYM_VALUE Synonym = m_SynonymList.Find(s => strCodeWord.Contains(s.m_strName)); if(Synonym == null) return null; return m_CodeList.Find(s => s.m_strCode == Synonym.m_strCode); } catch(Exception ex) { Console.WriteLine(ex.Message + Environment.NewLine + ex.StackTrace); } return null; } public CODE_VALUE GetCode(string strCode) { CODE_VALUE Result = m_CodeList.Find(s => s.m_strCode == strCode); return Result; } public CODE_VALUE GetCodeByName(string strCodeName) { CODE_VALUE Result = m_CodeList.Find(s => s.m_strName == strCodeName); return Result; } public List GetAllDeny() { return m_CodeList.Where(r => r.m_enType == CODE_TYPE.DENIAL).Select(c => c.m_strName).ToList(); } public List GetAllDuplicated() { return m_CodeList.Where(r => r.m_enType == CODE_TYPE.DUPLICATED).Select(c => c.m_strName).ToList(); } public List GetAllManual() { return m_CodeList.Where(r => r.m_enType == CODE_TYPE.MANUAL).Select(c => c.m_strName).ToList(); } public List GetAllSynonym() { return m_SynonymList.Select(r => $"{r.m_strName}={r.m_strName}").ToList(); } } }