toCsv static method

Future<String> toCsv(
  1. Data data
)

Implementation

static Future<String> toCsv(Data data) async {
  final buffer = StringBuffer();
  String string = "";

  int i = 0;
  try {
    // Build Header
    List<String> header = [];
    List<String> columns = [];
    if (data.isNotEmpty) {
      if (data.first is Map) {
        (data.first as Map).forEach((key, value) {
          columns.add(key);
          String h = key.toString();
          h.replaceAll('"', '""');
          h = h.contains(',') ? '"$h"' : h;
          header.add(h);
        });
      }
    }

    // Output Header
    buffer.write('${header.join(", ")}\n');

    // Output Data
    if (columns.isNotEmpty) {
      for (var map in data) {
        i++;
        List<String> row = [];
        for (var column in columns) {
          String value =
              map.containsKey(column) ? map[column].toString() : '';
          value.replaceAll('"', '""');
          value = value.contains(',') ? '"$value"' : value;
          row.add(value);
        }
        buffer.write('${row.join(", ")}\n');
      }
    }

    // eof
    string = buffer.toString();
    string = string.replaceFirst('\n', '\r\n', string.lastIndexOf('\n'));
  } catch (e) {
    Log().debug('Error - Creating CSV column[$i]');
    Log().exception(e);
  }
  return string;
}