/// <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);
                    }
                }
            }
        }
Пример #2
0
        /// <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);
            }
        }
Пример #3
0
 public IList <string> SplitKeyword(string keyword, int ngram)
 {
     return(IndexUtility.SplitKeyword(keyword, ngram).ToList());
 }