В Flutter, как я могу очень быстро объединить данные в строку?

#flutter #dart

#flutter #дротик

Вопрос:

Я собираю данные акселерометра со своего телефона с помощью пакета sensors, добавляю эти данные в a List<AccelerometerEvent> , а затем объединяю эти данные в строку (csv), чтобы я мог использовать file.writeAsString() для сохранения этих данных в виде файла csv. Проблема, с которой я сталкиваюсь, заключается в том, что объединение данных в строку занимает слишком много времени.

Например:

Длина списка: 28645

Миллисекунды для объединения в строку csv: 113580

Код:

     for (AccelerometerEvent event in history) {
      dataString = dataString   '${event.timestamp},${event.x},${event.y},${event.z}n';
    }
 

Какой был бы более эффективный способ сделать это?
Должен ли я вообще объединять данные в строку или есть лучший способ сохранить эти данные в файл?

Спасибо

Комментарии:

1. проверить StringBuffer

2. или вместо использования File.writeAsString попробуйте File.openWrite записать свои данные в цикле, чтобы они возвращались IOSink , вызывая IOSink.writeln метод, например

3. @pskink вау, StringBuffer сработал действительно хорошо, спасибо!

4. или даже без всякого цикла: Stream.fromIterable(history).map((event) => '${event.timestamp},${event.x},${event.y},${event.z}n').transform(utf8.encoder).pipe(outputSink) — вот и все!

Ответ №1:

Создайте файловый объект

напишите первую строку с именами столбцов, и после этого каждая строка (после n) будет событием

См.: FileMode.append

Добавит новые строки без замены существующей строки в файле

  File file = File('events.csv');
 file.writeAsStringSync('TIMESTAMP, X, Y, Zn', mode: FileMode.append);
 for (AccelerometerEvent event in history) {
      final x = event.x;
      final y = event.y;
      final z = event.z;
      final timestamp = event.timestamp;
      String data = '$timestamp, $x, $y, $z';
      file.writeAsStringSync('$datan', mode: FileMode.append);
 }