Files
NewsCrawler/CodeList.cs
2018-12-04 23:24:24 +09:00

338 lines
9.8 KiB
C#

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<CODE_VALUE> m_CodeList = new List<CODE_VALUE>();
List<SYNONYM_VALUE> m_SynonymList = new List<SYNONYM_VALUE>();
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<iCnt; i++)
{
CODE_VALUE Code = new CODE_VALUE();
Code.m_enType = CODE_TYPE.ORIGINAL;
Code.m_strCode = m_StockCode.GetData(0, i);
Code.m_strName = m_StockCode.GetData(1, i);
var CodeMarketKind = CodeMgr.GetStockMarketKind(Code.m_strCode);
var CodeSectionKind = CodeMgr.GetStockSectionKind(Code.m_strCode);
//if(Code.m_strCode[0] == 'A' &&
// (CodeMarketKind != CPUTILLib.CPE_MARKET_KIND.CPC_MARKET_FREEBOARD) &&
// (CodeSectionKind == CPUTILLib.CPE_KSE_SECTION_KIND.CPC_KSE_SECTION_KIND_NULL ||
// CodeSectionKind == CPUTILLib.CPE_KSE_SECTION_KIND.CPC_KSE_SECTION_KIND_ST))
//{
m_CodeList.Add(Code);
//}
}
m_CodeList.Sort((a, b) => 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 ClearDuplicatedList()
{
string strPath = Util.GetConfigPath() + "/code-duplicated.txt";
File.WriteAllBytes(strPath, new byte[] { });
LoadCodeType(strPath, CODE_TYPE.DUPLICATED);
}
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<string> ReqList = new List<string>();
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<iReturnCnt; i++)
{
int iCurPrice = stockMstM.GetDataValue(4, i);
if(iCurPrice >= 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<string> GetAllDeny()
{
return m_CodeList.Where(r => r.m_enType == CODE_TYPE.DENIAL).Select<CODE_VALUE, string>(c => c.m_strName).ToList();
}
public List<string> GetAllDuplicated()
{
return m_CodeList.Where(r => r.m_enType == CODE_TYPE.DUPLICATED).Select<CODE_VALUE, string>(c => c.m_strName).ToList();
}
public List<string> GetAllManual()
{
return m_CodeList.Where(r => r.m_enType == CODE_TYPE.MANUAL).Select<CODE_VALUE, string>(c => c.m_strName).ToList();
}
public List<string> GetAllSynonym()
{
return m_SynonymList.Select(r => $"{r.m_strName}={r.m_strName}").ToList();
}
}
}