internal void Start(DicType dicType, string file) { var processName = ""; try { string rootDir; IDictionaryParser parser; WordData data = null; switch (dicType) { case DicType.Eijiro: rootDir = Constants.EijiroData; parser = new EijiroParser(file); break; case DicType.Webster: rootDir = Constants.WebsterData; parser = new WebsterParser(file); break; default: throw new Exception($"unknown key type : {dicType}"); } // firstly delete files Directory.Delete(rootDir, true); Directory.CreateDirectory(rootDir); // get filename var dataFiles = AppUtil.GetKeyList(); this._callback.OnPrepared(parser.GetRowCount((long rowCount) => { this._callback.OnPrepared(rowCount); })); FileOperator op = null; string currentNm = ""; while ((data = parser.Read()) != null) { this._callback.OnProceed(parser.CurrentLine); string nm = AppUtil.ConvertToFileName(data.Word); if (currentNm != nm) { currentNm = nm; op?.Close(); op = new FileOperator($@"{rootDir}\{nm}", FileOperator.OpenMode.Write); } op.WriteLine($"{data.Word}\t{this.GetDisplayData(data)}"); } op?.Close(); this._callback.OnSuccess(); } catch (Exception ex) { this._callback.OnFail(processName + "\n" + ex.Message); } }
/// <summary> /// search dictionary /// </summary> /// <param name="word">word</param> /// <param name="matchType">search matching type</param> /// <returns>result. if data does not find, return null</returns> internal List <DictionaryData> SearchData(string word, MatchType matchType) { // create search list var nm = AppUtil.ConvertToFileName(word); if (nm != this._searchWord) { this._searchWord = nm; foreach (var dir in Constants.DataDirs) { if (!this._wordList[dir].ContainsKey(nm)) { var file = $@"{dir}\{nm}"; if (File.Exists(file)) { this._wordList[dir][nm] = new List <DictionaryData>(); using (var op = new FileOperator($@"{dir}\{nm}", FileOperator.OpenMode.Read)) { while (!op.Eof) { var line = op.ReadLine().Split('\t'); var data = new DictionaryData { Word = line[0], WordSort = line[0].ToLower(), Data = line[1] }; this._wordList[dir][nm].Add(data); } } } } } } List <DictionaryData> result = null; switch (matchType) { case MatchType.Exact: result = SearchExact(word); break; case MatchType.Prefix: result = SearchPrefix(word); break; } return(result); }
/// <summary> /// 完全一致検索 /// </summary> /// <param name="word">検索文字列</param> /// <returns>検索結果</returns> private List <DictionaryData> SearchExact(string word) { var result = new List <DictionaryData>(); var fileName = AppUtil.ConvertToFileName(word); foreach (var dir in Constants.DataDirs) { if (this._wordList[dir].ContainsKey(fileName)) { foreach (var data in this._wordList[dir][fileName]) { if (data.WordSort == word) { result.Add(data); break; } } } } return(result); }
/// <summary> /// 前方一致検索 /// </summary> /// <param name="word">検索文字列</param> /// <returns>検索結果</returns> private List <DictionaryData> SearchPrefix(string word) { int count; bool found; var result = new List <DictionaryData>(); var fileName = AppUtil.ConvertToFileName(word); foreach (var dir in Constants.DataDirs) { found = false; count = 0; if (this._wordList[dir].ContainsKey(fileName)) { foreach (var data in this._wordList[dir][_searchWord]) { if (data.WordSort.StartsWith(word)) { result.Add(data); found = true; count++; if (Constants.MaxNumberOfListWord / 2 < count) { break; } } else { if (found) { break; } } } } } return(result); }