Dart:
Làm việc với CSV

Làm thế nào:

Để xử lý tệp CSV trong Dart, bạn thường xử lý văn bản thủ công hoặc sử dụng các thư viện bên thứ ba để đơn giản hóa công việc. Ở đây, chúng ta sẽ xem xét cả hai cách tiếp cận.

Phân tích CSV Thủ công

Nếu nhu cầu của bạn đơn giản, bạn có thể chọn phân tích cú pháp một chuỗi CSV một cách thủ công. Điều này có thể được thực hiện bằng cách sử dụng các hàm thao tác chuỗi cốt lõi của Dart:

void main() {
  // Dữ liệu CSV mẫu
  String csvData = "Tên,Tuổi,Email\nJohn Doe,30,[email protected]\nJane Smith,25,[email protected]";
  
  // Chia dữ liệu CSV thành các dòng
  List<String> lines = csvData.split('\n');
  
  // Phân tích từng dòng
  List<Map<String, String>> data = [];
  List<String> headers = lines.first.split(',');
  
  for (var i = 1; i < lines.length; i++) {
    List<String> row = lines[i].split(',');
    Map<String, String> record = {};
    for (var j = 0; j < headers.length; j++) {
      record[headers[j]] = row[j];
    }
    data.add(record);
  }
  
  // Xuất dữ liệu đã phân tích
  print(data);
}

// Dữ liệu đầu ra mẫu:
// [{Tên: John Doe, Tuổi: 30, Email: john@example.com}, {Tên: Jane Smith, Tuổi: 25, Email: jane@example.com}]

Sử dụng Thư viện Bên thứ Ba: csv

Đối với các tình huống phức tạp hơn hoặc để đơn giản hóa mã của bạn, bạn có thể sử dụng một thư viện bên thứ ba phổ biến như csv. Đầu tiên, hãy thêm nó vào dự án của bạn bằng cách bao gồm csv: ^5.0.0 (hoặc phiên bản mới nhất) trong tệp pubspec.yaml của bạn dưới dependencies. Sau đó sử dụng nó như sau:

import 'package:csv/csv.dart';

void main() {
  String csvData = "Tên,Tuổi,Email\nJohn Doe,30,[email protected]\nJane Smith,25,[email protected]";
  
  // Sử dụng CsvToListConverter để phân tích dữ liệu CSV
  List<List<dynamic>> listData = const CsvToListConverter().convert(csvData);
  
  // Mục danh sách đầu tiên chứa tiêu đề
  List<String> headers = listData.first.map((item) => item.toString()).toList();
  
  // Xóa hàng tiêu đề trước khi xử lý tiếp
  listData.removeAt(0);
  
  // Chuyển đổi thành List<Map<String, dynamic>> để có định dạng cấu trúc tốt hơn
  List<Map<String, dynamic>> mappedData = listData.map((list) {
    Map<String, dynamic> map = {};
    for (int i = 0; i < headers.length; i++) {
      map[headers[i]] = list[i];
    }
    return map;
  }).toList();
  
  // Xuất dữ liệu đã ánh xạ
  print(mappedData);
}

// Dữ liệu đầu ra mẫu:
// [{Tên: John Doe, Tuổi: 30, Email: john@example.com}, {Tên: Jane Smith, Tuổi: 25, Email: jane@example.com}]

Cả hai phương pháp đều minh họa cách làm việc với dữ liệu CSV: phương pháp đầu tiên là thủ công, dành cho mục đích học tập hoặc khi xử lý các cấu trúc CSV rất đơn giản; phương pháp thứ hai, bằng cách tận dụng một thư viện mạnh mẽ giúp đơn giản hóa việc phân tích và có thể xử lý các độ phức tạp khác nhau của định dạng CSV.