예제 #1
0
        private static bool LoadDat(string path)
        {
            try
            {
                var ba = ByteArray.Create(path + Predefine.BIN_EXT);
                if (ba == null)
                {
                    return(false);
                }

                // 先读取values
                var size  = ba.NextInt();
                var attrs = new WordAttr[size];

                for (int i = 0; i < size; i++)
                {
                    var totalFreq = ba.NextInt();
                    var len       = ba.NextInt();
                    attrs[i]           = new WordAttr(len);
                    attrs[i].totalFreq = totalFreq;
                    for (int j = 0; j < len; j++)
                    {
                        attrs[i].natures[j] = (Nature)ba.NextInt();
                        attrs[i].freqs[j]   = ba.NextInt();
                    }
                }

                return(_trie.Load(ba, attrs) && !ba.HasMore());
            }
            catch (Exception e)
            {
                // log warning "dat file reading failed"
                return(false);
            }
        }
예제 #2
0
        public void LoadTest()
        {
            var path = Path.Combine(Config.DataRootPath, _testFile);

            if (!File.Exists(path))
            {
                BuildTest();
            }

            DoubleArrayTrie <string> trie = new DoubleArrayTrie <string>();

            trie.Load(path, _mockData.Values.ToList());

            var res = trie.Get("测试key3");

            Assert.Equal(res, "测试value3");
        }
예제 #3
0
        private static bool LoadDat(string path)
        {
            var ba = ByteArray.Create(path);

            if (ba == null)
            {
                return(false);
            }
            var size = ba.NextInt_HighFirst();          // 直接读取原始二进制文件,需要兼容模式
            var arr  = new string[size];

            for (int i = 0; i < arr.Length; i++)
            {
                arr[i] = ba.NextUTFStr(true);
            }

            return(_trie.Load(ba, arr, true));
        }
예제 #4
0
        public static void Load(string path)
        {
            _trie = new DoubleArrayTrie <int>();
            var valueArr = LoadDat(path + ".value.dat");

            if (valueArr != null)
            {
                if (_trie.Load(path + ".trie.dat", valueArr))
                {
                    return;
                }
            }
            var map = new SortedDictionary <string, int>(StrComparer.Default);

            foreach (var line in File.ReadLines(path))
            {
                if (string.IsNullOrWhiteSpace(line))
                {
                    continue;
                }
                var segs = line.Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);
                map[segs[0]] = int.Parse(segs[1]);
            }
            _trie = new DoubleArrayTrie <int>();
            _trie.Build(map);
            valueArr = new int[map.Count];
            int m = 0;

            foreach (var v in map.Values)
            {
                valueArr[m++] = v;
            }

            var fs = new FileStream(path + ".trie.dat", FileMode.Create, FileAccess.Write);

            _trie.Save(fs);
            fs.Close();
            SaveDat(path + ".value.dat", valueArr);
        }
예제 #5
0
 private static bool LoadDat() => _trie.Load(Config.Translated_Person_Dict_Path + Predefine.BIN_EXT);
예제 #6
0
        public static bool Load(string path)
        {
            try
            {
                _trie = new DoubleArrayTrie <AreaInfo>();
                var valueArr = LoadDat(path + ".value.dat");
                if (valueArr != null)
                {
                    if (_trie.Load(path + ".trie.dat", valueArr))
                    {
                        return(true);
                    }
                }
                // 读取txt文件
                var map = new SortedDictionary <string, AreaInfo>(StrComparer.Default);
                foreach (var line in File.ReadLines(path))
                {
                    if (string.IsNullOrWhiteSpace(line))
                    {
                        continue;
                    }
                    var segs = line.Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);
                    var code = segs[0];
                    for (int i = 1; i < segs.Length; i++)
                    {
                        var name = segs[i];
                        if (Invalids.Contains(name))
                        {
                            continue;                            // 跳过无效地区名
                        }
                        if (name.Length == 2)
                        {
                            AddInMap(name, "", code, map);
                        }
                        else
                        {
                            var lastChar = name[name.Length - 1];
                            if ("市省县区州旗盟".Contains(lastChar))
                            {
                                AddInMap(name.Substring(0, name.Length - 1), lastChar.ToString(), code, map);
                            }
                            else if (name.Length < 9)
                            {
                                AddInMap(name, "", code, map);
                            }
                            var lastTwo = name.Substring(2);
                            var prevs   = name.Substring(0, name.Length - 2);
                            if (Invalids.Contains(lastTwo))
                            {
                                AddInMap(prevs, lastTwo, code, map);
                                if (prevs.Length == 3 && "市省".Contains(prevs[2]))
                                {
                                    AddInMap(name.Substring(0, 2), lastTwo, code, map);
                                }
                            }
                            if (lastChar == '旗')
                            {
                                var sublast = name[2];
                                if ("前后左中右特".Contains(sublast))
                                {
                                    AddInMap(prevs, "旗", code, map);
                                }
                            }
                            var subLastTwo = name.Substring(name.Length - 3, 2);
                            if (subLastTwo == "自治")
                            {
                                prevs = name.Substring(0, name.Length - 3);
                                var ends = name.Substring(name.Length - 3);
                                AddInMap(prevs, ends, code, map);
                                if (prevs.Length >= 4)
                                {
                                    for (int k = 2; k < prevs.Length - 1; k++)
                                    {
                                        if (k < prevs.Length - 3)
                                        {
                                            if (Nationalities.Contains(prevs.Substring(k, 4)))
                                            {
                                                AddInMap(prevs.Substring(0, k), ends, code, map);
                                                AddInMap(prevs.Substring(0, k) + "自治", lastChar.ToString(), code, map);
                                                break;
                                            }
                                        }
                                        if (k < prevs.Length - 2)
                                        {
                                            if (Nationalities.Contains(prevs.Substring(k, 3)))
                                            {
                                                AddInMap(prevs.Substring(0, k), ends, code, map);
                                                AddInMap(prevs.Substring(0, k) + "自治", lastChar.ToString(), code, map);
                                                break;
                                            }
                                        }
                                        if (Nationalities.Contains(prevs.Substring(k, 2)))
                                        {
                                            AddInMap(prevs.Substring(0, k), ends, code, map);
                                            AddInMap(prevs.Substring(0, k) + "自治", lastChar.ToString(), code, map);
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }

                _trie = new DoubleArrayTrie <AreaInfo>();
                _trie.Build(map);
                valueArr = new AreaInfo[map.Count];
                int m = 0;
                foreach (var v in map.Values)
                {
                    valueArr[m++] = v;
                }

                var fs = new FileStream(path + ".trie.dat", FileMode.Create, FileAccess.Write);
                _trie.Save(fs);
                fs.Close();
                SaveDat(path + ".value.dat", valueArr);
                return(true);
            }
            catch (Exception e)
            {
                return(false);
            }
        }