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 @@ @@ -1,4 +1,5 @@
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:syncfusion_flutter_datagrid/datagrid.dart';
@ -13,53 +14,56 @@ class DataCompareController extends BaseContentController { @@ -13,53 +14,56 @@ class DataCompareController extends BaseContentController {
dataSource = DataCompareDataSource(this);
}
void importLeftTable(String csvContent) {
final lines = csvContent.split('\n');
if (lines.isEmpty) return;
// Parse headers (skip first column which is for serial number)
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);
}
Future<void> importCsv(bool isLeftTable, String csvContent) async {
try {
// 1.
final lines = csvContent.split('\n');
if (lines.isEmpty) return;
_compareData();
notifyListeners();
}
String delimiter = lines[0].contains(',') ? ',' : '\t';
// 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');
if (lines.isEmpty) return;
// Parse headers (skip first column which is for serial number)
rightColumns = lines[0].split(',').skip(1).toList();
// Parse data
rightData = [];
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 < rightColumns.length; j++) {
row[rightColumns[j]] = j + 1 < values.length ? values[j + 1] : '';
//
final row = {
'serial': i.toString(), //
'key': values[0], //
};
//
for (int j = 0; j < headers.length; j++) {
row[headers[j]] = (j + 1 < values.length) ? values[j + 1] : '';
}
data.add(row);
}
rightData.add(row);
}
_compareData();
notifyListeners();
if (isLeftTable) {
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
// This would update the comparison status for each row
dataSource.updateData(leftData, rightData);

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

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

Loading…
Cancel
Save