338 lines
9.8 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|