Browse Source

开始数据对比前

master
hejl 2 months ago
parent
commit
ed57f6162a
  1. 86
      win_text_editor/lib/modules/data_compare/controllers/data_compare_controller.dart
  2. 23
      win_text_editor/lib/modules/data_compare/widgets/data_compare_view.dart

86
win_text_editor/lib/modules/data_compare/controllers/data_compare_controller.dart

@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:win_text_editor/framework/controllers/logger.dart';
import 'package:win_text_editor/shared/base/base_content_controller.dart'; import 'package:win_text_editor/shared/base/base_content_controller.dart';
import 'package:syncfusion_flutter_datagrid/datagrid.dart'; import 'package:syncfusion_flutter_datagrid/datagrid.dart';
@ -13,53 +14,56 @@ class DataCompareController extends BaseContentController {
dataSource = DataCompareDataSource(this); dataSource = DataCompareDataSource(this);
} }
void importLeftTable(String csvContent) { Future<void> importCsv(bool isLeftTable, String csvContent) async {
final lines = csvContent.split('\n'); try {
if (lines.isEmpty) return; // 1.
final lines = csvContent.split('\n');
// Parse headers (skip first column which is for serial number) if (lines.isEmpty) return;
leftColumns = lines[0].split(',').skip(1).toList();
// Parse data
leftData = [];
for (int i = 1; i < lines.length; i++) {
if (lines[i].trim().isEmpty) continue;
final values = lines[i].split(',');
final row = {'serial': i.toString(), 'key': values[0]};
for (int j = 0; j < leftColumns.length; j++) {
row[leftColumns[j]] = j + 1 < values.length ? values[j + 1] : '';
}
leftData.add(row);
}
_compareData(); String delimiter = lines[0].contains(',') ? ',' : '\t';
notifyListeners();
} // 2.
final headers = lines[0].split(delimiter).skip(1).toList();
// 3.
List<Map<String, dynamic>> data = [];
for (int i = 1; i < lines.length; i++) {
if (lines[i].trim().isEmpty) continue;
final values = lines[i].split(delimiter);
if (values.length < 1) continue;
void importRightTable(String csvContent) { //
final lines = csvContent.split('\n'); final row = {
if (lines.isEmpty) return; 'serial': i.toString(), //
'key': values[0], //
// Parse headers (skip first column which is for serial number) };
rightColumns = lines[0].split(',').skip(1).toList();
//
// Parse data for (int j = 0; j < headers.length; j++) {
rightData = []; row[headers[j]] = (j + 1 < values.length) ? values[j + 1] : '';
for (int i = 1; i < lines.length; i++) { }
if (lines[i].trim().isEmpty) continue;
final values = lines[i].split(','); data.add(row);
final row = {'serial': i.toString(), 'key': values[0]};
for (int j = 0; j < rightColumns.length; j++) {
row[rightColumns[j]] = j + 1 < values.length ? values[j + 1] : '';
} }
rightData.add(row);
}
_compareData(); if (isLeftTable) {
notifyListeners(); leftColumns = headers;
leftData = data;
} else {
rightColumns = headers;
rightData = data;
}
compareData();
notifyListeners();
} catch (e) {
Logger().error('${isLeftTable ? '左表' : '右表'}数据导入失败: $e');
rethrow;
}
} }
void _compareData() { void compareData() {
// Implement comparison logic here // Implement comparison logic here
// This would update the comparison status for each row // This would update the comparison status for each row
dataSource.updateData(leftData, rightData); dataSource.updateData(leftData, rightData);

23
win_text_editor/lib/modules/data_compare/widgets/data_compare_view.dart

@ -1,8 +1,11 @@
import 'dart:io';
import 'package:file_picker/file_picker.dart'; import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:syncfusion_flutter_datagrid/datagrid.dart'; import 'package:syncfusion_flutter_datagrid/datagrid.dart';
import 'package:win_text_editor/framework/controllers/logger.dart';
import 'package:win_text_editor/framework/controllers/tab_items_controller.dart'; import 'package:win_text_editor/framework/controllers/tab_items_controller.dart';
import 'package:win_text_editor/modules/data_compare/controllers/data_compare_controller.dart'; import 'package:win_text_editor/modules/data_compare/controllers/data_compare_controller.dart';
import 'data_compare_grid.dart'; // import 'data_compare_grid.dart'; //
@ -57,14 +60,12 @@ class _DataCompareViewState extends State<DataCompareView> {
); );
if (result != null) { if (result != null) {
final file = result.files.single; final file = File(result.files.single.path!);
final content = await rootBundle.loadString(file.path!); final content = await file.readAsString();
_controller.importLeftTable(content); await _controller.importCsv(true, content);
} }
} catch (e) { } catch (e) {
ScaffoldMessenger.of( Logger().error('左表导入失败: ${e.toString()}');
context,
).showSnackBar(SnackBar(content: Text('Failed to import left table: $e')));
} }
} }
@ -76,14 +77,12 @@ class _DataCompareViewState extends State<DataCompareView> {
); );
if (result != null) { if (result != null) {
final file = result.files.single; final file = File(result.files.single.path!);
final content = await rootBundle.loadString(file.path!); final content = await file.readAsString();
_controller.importRightTable(content); await _controller.importCsv(false, content);
} }
} catch (e) { } catch (e) {
ScaffoldMessenger.of( Logger().error('右表导入失败: ${e.toString()}');
context,
).showSnackBar(SnackBar(content: Text('Failed to import right table: $e')));
} }
} }

Loading…
Cancel
Save