info("scan:" . $dir); if ($files = scandir($dir)) { //进入目录搜索字典或子目录 foreach ($files as $file) { //进入语言目录循环搜索 $fullPath = $dir . "/" . $file; if (is_dir($fullPath) && $file !== '.' && $file !== '..') { //是目录继续搜索 $this->scandict($fullPath); } else { //是文件,查看是否是字典信息文件 $infoFile = $fullPath; if (pathinfo($infoFile, PATHINFO_EXTENSION) === 'ini') { $this->dictInfo = parse_ini_file($infoFile, true); if (isset($this->dictInfo['meta']['dictname'])) { //是字典信息文件 $this->info($this->dictInfo['meta']['dictname']); if (Str::isUuid($this->argument('uuid'))) { if ($this->argument('uuid') !== $this->dictInfo['meta']['uuid']) { continue; } } if (!Str::isUuid($this->dictInfo['meta']['uuid'])) { $this->error("not uuid"); continue; } //读取 description $desFile = $dir . "/description.md"; if (file_exists($desFile)) { $description = file_get_contents($desFile); } else { $description = $this->dictInfo['meta']['description']; } $tableDict = DictInfo::firstOrNew([ "id" => $this->dictInfo['meta']['uuid'] ]); $tableDict->id = $this->dictInfo['meta']['uuid']; $tableDict->name = $this->dictInfo['meta']['dictname']; $tableDict->shortname = $this->dictInfo['meta']['shortname']; $tableDict->description = $description; $tableDict->src_lang = $this->dictInfo['meta']['src_lang']; $tableDict->dest_lang = $this->dictInfo['meta']['dest_lang']; $tableDict->rows = $this->dictInfo['meta']['rows']; $tableDict->owner_id = config("mint.admin.root_uuid"); $tableDict->meta = json_encode($this->dictInfo['meta']); $tableDict->save(); if ($this->option('part')) { $this->info(" dict id = " . $this->dictInfo['meta']['uuid']); } else { $del = UserDict::where("dict_id", $this->dictInfo['meta']['uuid'])->delete(); $this->info("delete {$del} rows dict id = " . $this->dictInfo['meta']['uuid']); } /** * 允许一个字典拆成若干个小文件 * 文件名 为 ***.csv , ***-1.csv , ***-2.csv * */ $filename = $dir . '/' . pathinfo($infoFile, PATHINFO_FILENAME); $csvFile = $filename . ".csv"; $count = 0; $bar = $this->output->createProgressBar($this->dictInfo['meta']['rows']); while (file_exists($csvFile)) { # code... $this->info("runing:{$csvFile}"); $inputRow = 0; if (($fp = fopen($csvFile, "r")) !== false) { $this->cols = array(); while (($data = fgetcsv($fp, 0, ',')) !== false) { if ($inputRow == 0) { foreach ($data as $key => $colname) { # 列名列表 $this->cols[$colname] = $key; } } else { if ($this->option('part')) { //仅仅提取拆分零件 $word = $this->get($data, 'word'); $factor1 = $this->get($data, 'factors'); $factor1 = \str_replace([' ', '(', ')', '=', '-', '$'], "+", $factor1); foreach (\explode('+', $factor1) as $part) { # code... if (empty($part)) { continue; } if (isset($newPart[$part])) { $newPart[$part][0]++; } else { $partExists = Cache::remember('dict/part/' . $part, config('cache.expire', 1000), function () use ($part) { return UserDict::where('word', $part)->exists(); }); if (!$partExists) { $count++; $newPart[$part] = [1, $word]; $this->info("{$count}:{$part}-{$word}"); } } } } else { $newDict = new UserDict(); $newDict->id = app('snowflake')->id(); $newDict->word = $data[$this->cols['word']]; $newDict->type = $this->get($data, 'type'); $newDict->grammar = $this->get($data, 'grammar'); $newDict->parent = $this->get($data, 'parent'); $newDict->mean = $this->get($data, 'mean'); $newDict->note = $this->get($data, 'note'); $newDict->factors = $this->get($data, 'factors'); $newDict->factormean = $this->get($data, 'factormean'); $newDict->status = $this->get($data, 'status'); $newDict->language = $this->get($data, 'language'); $newDict->confidence = $this->get($data, 'confidence'); $newDict->source = $this->get($data, 'source'); $newDict->create_time = (int)(microtime(true) * 1000); $newDict->creator_id = 0; $newDict->dict_id = $this->dictInfo['meta']['uuid']; $newDict->save(); } $bar->advance(); } $inputRow++; } } $count++; $csvFile = $filename . "-{$count}.csv"; } $bar->finish(); Storage::disk('local')->put("tmp/pm-part.csv", "part,count,word"); if (isset($newPart)) { foreach ($newPart as $part => $info) { # 写入磁盘文件 Storage::disk('local')->append("tmp/pm-part.csv", "{$part},{$info[0]},{$info[1]}"); } } $this->info("done"); } } } } //子目录搜素完毕 return; } else { //获取子目录失败 $this->error("scandir fail"); return; } } else { $this->error("this is not dir input={$dir}"); return; } } /** * 获取列的值 */ protected function get($data, $colname, $defualt = "") { if (isset($this->cols[$colname])) { return $data[$this->cols[$colname]]; } else if (isset($this->dictInfo['cols'][$colname])) { return $this->dictInfo['cols'][$colname]; } else { return $defualt; } } /** * Execute the console command. * * @return int */ public function handle() { if (\App\Tools\Tools::isStop()) { return 0; } $this->info("upgrade dict start"); $this->scandict(config("mint.path.dict_text")); $this->info("upgrade dict done"); return 0; } }