import React, { useState } from 'react'; import { FileText, Upload, Download, Loader2, CheckCircle, AlertCircle, Info, Trash2, ArrowLeft } from 'lucide-react'; import { useNavigate } from 'react-router-dom'; import { invoke } from '@tauri-apps/api/core'; import { open, save } from '@tauri-apps/plugin-dialog'; import { listen } from '@tauri-apps/api/event'; import { useNotifications } from '../../components/NotificationSystem'; interface DataCleaningProgress { current: number; total: number; percentage: number; status: string; } interface DataCleaningResult { success: boolean; message: string; original_count: number; removed_count: number; final_count: number; output_file: string; } /** * AI检索图片/数据清洗工具详情页 * 遵循 Tauri 开发规范和 UI/UX 设计标准 */ const DataCleaningTool: React.FC = () => { const navigate = useNavigate(); const [allDataFile, setAllDataFile] = useState(''); const [removeDataFile, setRemoveDataFile] = useState(''); const [outputFile, setOutputFile] = useState(''); const [isProcessing, setIsProcessing] = useState(false); const [progress, setProgress] = useState(null); const [result, setResult] = useState(null); const { success, error } = useNotifications(); // 选择全部数据文件 const selectAllDataFile = async () => { try { const selected = await open({ multiple: false, filters: [{ name: 'JSONL Files', extensions: ['jsonl'] }] }); if (selected && typeof selected === 'string') { setAllDataFile(selected); } } catch (err) { error('文件选择失败', '无法选择全部数据文件'); } }; // 选择要去除的数据文件 const selectRemoveDataFile = async () => { try { const selected = await open({ multiple: false, filters: [{ name: 'JSONL Files', extensions: ['jsonl'] }] }); if (selected && typeof selected === 'string') { setRemoveDataFile(selected); } } catch (err) { error('文件选择失败', '无法选择要去除的数据文件'); } }; // 选择输出文件 const selectOutputFile = async () => { try { const selected = await save({ filters: [{ name: 'JSONL Files', extensions: ['jsonl'] }], defaultPath: 'cleaned_data.jsonl' }); if (selected) { setOutputFile(selected); } } catch (err) { error('文件选择失败', '无法选择输出文件'); } }; // 开始数据清洗 const startDataCleaning = async () => { if (!allDataFile || !removeDataFile || !outputFile) { error('参数错误', '请选择所有必需的文件'); return; } setIsProcessing(true); setProgress(null); setResult(null); try { // 监听进度事件 const unlisten = await listen('data-cleaning-progress', (event) => { setProgress(event.payload); }); // 调用后端命令 const cleaningResult = await invoke('clean_jsonl_data', { allDataFile, removeDataFile, outputFile }); setResult(cleaningResult); if (cleaningResult.success) { success('数据清洗完成', `原始数据: ${cleaningResult.original_count} 条,` + `去除重复: ${cleaningResult.removed_count} 条,` + `最终结果: ${cleaningResult.final_count} 条` ); } else { error('数据清洗失败', cleaningResult.message); } // 清理事件监听器 unlisten(); } catch (err) { const errorMessage = err instanceof Error ? err.message : '未知错误'; error('数据清洗失败', errorMessage); } finally { setIsProcessing(false); } }; // 重置表单 const resetForm = () => { setAllDataFile(''); setRemoveDataFile(''); setOutputFile(''); setProgress(null); setResult(null); }; return (
{/* 页面标题和返回按钮 */}

AI检索图片/数据清洗

JSONL格式数据去重处理工具

{/* 工具主体内容 */}

数据清洗工具

高效处理JSONL格式数据,支持大文件批量去重

{/* 使用说明 */}

使用说明:

  • 选择包含所有数据的JSONL文件(全部数据)
  • 选择包含要去除数据的JSONL文件(要去除的数据)
  • 系统将根据URI字段进行匹配,去除重复项
  • 处理结果将保存到指定的输出文件
{/* 文件选择区域 */}
{/* 全部数据文件 */}
{allDataFile && (

{allDataFile}

)}
{/* 要去除的数据文件 */}
{removeDataFile && (

{removeDataFile}

)}
{/* 输出文件选择 */}
{outputFile && (

{outputFile}

)}
{/* 进度显示 */} {progress && (

正在处理数据...

{progress.status}

{progress.current} / {progress.total} ({progress.percentage.toFixed(1)}%)

)} {/* 结果显示 */} {result && (
{result.success ? ( ) : ( )}

{result.success ? '数据清洗完成' : '数据清洗失败'}

{result.message}

{result.success && (

原始数据: {result.original_count} 条

去除重复: {result.removed_count} 条

最终结果: {result.final_count} 条

输出文件: {result.output_file}

)}
)} {/* 操作按钮 */}
); }; export default DataCleaningTool;