/// <summary> /// インデックスなしでの検索です。 /// </summary> /// <param name="csvFilePath"></param> /// <param name="keyword"></param> /// <returns></returns> private static IEnumerable <string> SearchKeywordNoIndex(string csvFilePath, string keyword) { var splitKeywords = IndexUtility.SplitKeyword(keyword, 2).ToList(); using (var reader = new CsvReader(new StreamReader(csvFilePath, Encoding.GetEncoding("Shift-JIS")))) { while (reader.Read()) { var containCheckList = new bool[splitKeywords.Count()]; foreach (var cellData in reader.Context.Record) { foreach (var item in splitKeywords.Select((value, index) => new { value, index })) { if (cellData.Contains(item.value)) { containCheckList[item.index] = true; } } } if (containCheckList.All(isContain => isContain)) { string text = string.Join(",", reader.Context.Record); yield return(text); } } } }
/// <summary> /// レコードを検索します。 /// </summary> /// <param name="keyword">検索キーワード</param> public IEnumerable <string> SearchRecord(string keyword) { string filePath = FileUtility.GetIndexFilePath(_storageDirectoryPath); if (String.IsNullOrEmpty(filePath)) { Console.WriteLine("インデックスがありません。先にインデックスを作成してください。"); yield break; } var keywordSplit = IndexUtility.SplitKeyword(keyword, Ngram).ToList(); var indices = IndexUtility.LoadIndexData(filePath, FileEncoding, keywordSplit); var result = IndexUtility.SearchKeywordLines(keywordSplit.FirstOrDefault(), indices); foreach (var item in keywordSplit.Skip(1)) { var next = IndexUtility.SearchKeywordLines(item, indices).ToList(); result = result.Intersect(next); } var resultList = result.ToList(); string csvFilePath = FileUtility.GetCsvFilePath(_storageDirectoryPath); foreach (var text in FileUtility.GetFileLines(resultList, csvFilePath, FileEncoding)) { yield return(text); } }
public IList <string> SplitKeyword(string keyword, int ngram) { return(IndexUtility.SplitKeyword(keyword, ngram).ToList()); }