option('limit'); $query = Sentence::type('translation')->select(['uid', 'content'])->orderBy('uid'); $total = $query->count(); $this->info("符合要求的 sentences 总数: {$total}".($limit > 0 ? "(本次仅处理前 {$limit} 条)" : '')); if ($total === 0) { $this->warn('没有找到任何记录,退出。'); return 0; } if ($limit > 0) { $query = $query->limit($limit); } $wordCounts = []; $processed = 0; $matchedSentences = 0; foreach ($query->cursor() as $sent) { $processed++; if (! empty($sent->content) && preg_match_all('/\[\[([^\[\]]+)\]\]/u', $sent->content, $matches) > 0) { $matchedSentences++; foreach ($matches[1] as $word) { $word = trim($word); if ($word === '') { continue; } $wordCounts[$word] = ($wordCounts[$word] ?? 0) + 1; } } if ($processed % 1000 === 0) { $this->info("已处理 {$processed}/{$total} 条,其中 {$matchedSentences} 条包含 [[巴利文]],累计发现 ".count($wordCounts).' 个不同单词'); } } arsort($wordCounts, SORT_NUMERIC); $fileName = 'pali-word-frequency-'.date('Ymd-His').($limit > 0 ? "-limit{$limit}" : '').'.csv'; $exportDir = storage_path('app/public/export'); if (! is_dir($exportDir)) { mkdir($exportDir, 0755, true); } $filePath = $exportDir.'/'.$fileName; $file = fopen($filePath, 'w'); fwrite($file, "\xEF\xBB\xBF"); fputcsv($file, ['word', 'count']); foreach ($wordCounts as $word => $count) { fputcsv($file, [$word, $count]); } fclose($file); $this->info("扫描完成:共处理 {$processed} 条记录,{$matchedSentences} 条包含 [[巴利文]],".count($wordCounts).' 个不同单词'); $this->info("CSV 已输出: {$filePath}"); return 0; } }