#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);
}