Flutter CSV序列化处理插件serial_csv的使用

发布于 1周前 作者 bupafengyu 来自 Flutter

Flutter CSV序列化处理插件 serial_csv 的使用

简介

serial_csv 是一个高性能的 CSV 编解码器,能够保留数据类型和空值信息。与 JSON 相比,CSV 格式更加紧凑且易于阅读,无需进行“美化”操作。该插件使用更严格的 CSV 格式以优化性能,并支持以下数据类型:Stringintdoubleboolnull

CSV 结构

为了实现高性能,serial_csv 使用了更为严格的 CSV 格式:

  • 字符串单元格始终用双引号括起来。
  • 数字和布尔值单元格不使用双引号。
  • 空单元格表示为 null
  • 单元格内的双引号通过另一个双引号转义。
  • 单元格之间用逗号分隔。
  • 每行必须以换行符 \n(LF)结尾。
  • 最后一行也必须以换行符 \n(LF)结尾。
  • 不允许使用注释(如 #)。

虽然格式严格,但生成的 CSV 仍然是有效的 CSV 文件,可以使用其他 CSV 库读取。不过,建议不要使用其他工具修改 CSV 文件,以免破坏严格格式。

使用方法

serial_csv 提供了 SerialCsv.encodeSerialCsv.decode 方法来编解码 CSV 数据。以下是完整的示例代码,展示了如何使用 serial_csv 进行 CSV 的编解码操作。

完整示例 Demo

import 'package:serial_csv/serial_csv.dart';

void main() {
  // 示例 CSV 数据
  const csv = '"a","b","c"\n1,2.3,"3"\n4,,true\n';
  
  // 解码 CSV 数据
  List<List<dynamic>> decoded = SerialCsv.decode(csv);
  
  // 打印解码后的数据及其类型
  for (int row = 0; row < decoded.length; row++) {
    for (int col = 0; col < decoded[row].length; col++) {
      print('decoded[$row][$col]: ${decoded[row][col]} (${decoded[row][col].runtimeType})');
    }
  }

  // 重新编码解码后的数据
  String encoded = SerialCsv.encode(decoded);
  
  // 打印编码后的 CSV 数据
  print('encoded:');
  print(encoded);
}

仅字符串类型的 CSV 处理

如果只需要处理纯字符串类型的 CSV 数据,可以使用 encodeStringsdecodeStrings 方法。注意,这些方法不支持 null 值。

import 'package:serial_csv/serial_csv.dart';

void main() {
  // 示例纯字符串类型的 CSV 数据
  const rows = [
    ['a', 'b', 'c'],
    ['1', '2', '3'],
    ['4', '5', 'true'],
  ];

  // 编码纯字符串类型的 CSV 数据
  String encoded = SerialCsv.encodeStrings(rows);

  // 解码纯字符串类型的 CSV 数据
  List<List<String>> decoded = SerialCsv.decodeStrings(encoded);

  // 打印解码后的数据
  for (int row = 0; row < decoded.length; row++) {
    print('decoded[$row]: ${decoded[row]}');
  }

  // 打印编码后的 CSV 数据
  print('encoded:');
  print(encoded);
}

Key-Value 类型的 CSV 处理

serial_csv 还支持将非嵌套的 Map 编解码为 CSV。键必须是字符串,值可以是任何支持的类型。

import 'package:serial_csv/serial_csv.dart';

void main() {
  // 示例 Key-Value 类型的 Map
  const map = {
    'a': '1',
    'b': 2,
    'c': 3.4,
    'd': true,
    'e': null,
  };

  // 编码 Key-Value 类型的 CSV 数据
  String encoded = SerialCsv.encodeMap(map);

  // 解码 Key-Value 类型的 CSV 数据
  Map<String, dynamic> decoded = SerialCsv.decodeMap(encoded);

  // 打印解码后的数据及其类型
  for (var key in decoded.keys) {
    print('decoded[$key]: ${decoded[key]} (${decoded[key]?.runtimeType})');
  }

  // 打印编码后的 CSV 数据
  print('encoded:');
  print(encoded);
}

更多关于Flutter CSV序列化处理插件serial_csv的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter CSV序列化处理插件serial_csv的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用serial_csv插件来进行CSV序列化处理的一个简单示例。serial_csv是一个Flutter插件,用于将Dart对象序列化为CSV格式或从CSV格式反序列化为Dart对象。

首先,确保你已经在pubspec.yaml文件中添加了serial_csv依赖:

dependencies:
  flutter:
    sdk: flutter
  serial_csv: ^x.y.z  # 请替换为最新版本号

然后运行flutter pub get来安装依赖。

示例代码

1. 定义一个数据模型

首先,定义一个Dart数据模型,该模型将用于CSV序列化和反序列化。

import 'package:serial_csv/serial_csv.dart';

class Person with CsvSerializable {
  String name;
  int age;

  Person({required this.name, required this.age});

  // 工厂方法用于从CSV行创建对象
  factory Person.fromCsvRow(Map<String, dynamic> row) => Person(
        name: row['name'] as String,
        age: row['age'] as int,
      );

  // 将对象转换为Map,用于CSV序列化
  Map<String, dynamic> toCsvRow() => {'name': name, 'age': age};

  // 定义字段名称与CSV列名称的映射(如果需要自定义列名)
  @override
  List<String> get csvFields => ['name', 'age'];
}

2. 序列化对象列表为CSV字符串

import 'package:serial_csv/serial_csv.dart';

void main() {
  List<Person> people = [
    Person(name: 'Alice', age: 30),
    Person(name: 'Bob', age: 25),
  ];

  String csvString = CsvSerializer<Person>().serializeList(people);
  print(csvString);
  // 输出: name,age\nAlice,30\nBob,25
}

3. 反序列化CSV字符串为对象列表

import 'package:serial_csv/serial_csv.dart';

void main() {
  String csvString = 'name,age\nAlice,30\nBob,25';

  List<Person> people = CsvSerializer<Person>().deserializeList(csvString);
  people.forEach((person) => print('${person.name}, ${person.age}'));
  // 输出: Alice, 30
  //      Bob, 25
}

注意事项

  1. 确保你的数据模型类实现了CsvSerializable接口。
  2. 提供fromCsvRow工厂方法和toCsvRow方法,以便serial_csv插件知道如何从CSV行创建对象以及如何将对象转换为CSV行。
  3. 如果CSV列名与Dart对象字段名不同,可以使用csvFields属性来定义映射。

以上代码展示了如何使用serial_csv插件在Flutter中进行CSV序列化和反序列化。希望这对你有所帮助!

回到顶部