🏭
map splitを組み合わせる
💡Tips
業務で、mapが書かれているコードを見る機会があった。よくあるのかも知れないが。。。
ロジックも考えてみた。
List<Map<String, String>> items = [
{'fruit': 'apple'},
{'fruit': 'banana'},
{'fruit': 'cherry'},
{'fruit': 'date'},
{'fruit': 'elderberry'},
];
void main() {
// 文字列のリストを作成
final List<String> sentences = [
'apple,red,sweet',
'banana,yellow,soft',
'orange,orange,juicy',
'grape,purple,round'
];
// mapを使用して各文字列をsplitし、新しいリストを作成
final processedList = sentences.map((sentence) {
final parts = sentence.split(',');
return {
'fruit': parts[0],
'color': parts[1],
'characteristic': parts[2],
};
}).toList();
// 結果を表示
for (var item in processedList) {
print('Fruit: ${item['fruit']}, '
'Color: ${item['color']}, '
'Characteristic: ${item['characteristic']}');
}
}
実行結果:
Fruit: apple, Color: red, Characteristic: sweet
Fruit: banana, Color: yellow, Characteristic: soft
Fruit: orange, Color: orange, Characteristic: juicy
Fruit: grape, Color: purple, Characteristic: round
実際はどんな例で使われるのか?
IOTの例を出してみた。なんでIOTなのかというと今やってるからです笑
DartでのIoTデータ処理: split()とmap()の実践的活用法
IoTデバイスからのデータ処理では、センサーデータの変換や整形が重要な作業となります。Dartのspitとmapメソッドを組み合わせることで、効率的にデータを処理することができます。実践的な例を交えながら、その活用方法を解説していきます。
はじめに
IoTデバイスから送られてくるデータは、多くの場合カンマ区切りの文字列形式です。これらのデータを扱いやすい形式に変換し、アプリケーション内で活用するためには、効率的な処理方法が必要です。
実践的なIoTデータ処理の例
1. 温室栽培モニタリングシステム
以下は、温室内の環境センサーからのデータを処理する例です:
void main() {
// センサーから受信したデータ(カンマ区切り文字列のリスト)
final List<String> sensorData = [
'2024-01-07T10:00,28.5,65.2,800', // 日時,温度,湿度,CO2濃度
'2024-01-07T10:05,28.7,66.0,820',
'2024-01-07T10:10,29.0,65.8,810',
'2024-01-07T10:15,29.2,65.5,815'
];
// データの変換処理
final processedData = sensorData.map((reading) {
final parts = reading.split(',');
return {
'timestamp': parts[0],
'temperature': double.parse(parts[1]),
'humidity': double.parse(parts[2]),
'co2_level': int.parse(parts[3])
};
}).toList();
// アラート条件のチェック
for (var data in processedData) {
final temp = data['temperature'] as double;
if (temp > 29.0) {
print('温度警告: ${data['timestamp']}に${temp}°C を記録');
}
final co2 = data['co2_level'] as int;
if (co2 > 800) {
print('CO2濃度警告: ${data['timestamp']}に${co2}ppm を記録');
}
}
}
実行結果 :
CO2濃度警告: 2024-01-07T10:05に820ppm を記録
CO2濃度警告: 2024-01-07T10:10に810ppm を記録
温度警告: 2024-01-07T10:15に29.2°C を記録
CO2濃度警告: 2024-01-07T10:15に815ppm を記録
2. スマート工場の設備モニタリング
製造ラインの各設備からのステータスデータを処理する例:
void main() {
// 設備からのステータスデータ
final List<String> machineStatus = [
'Machine001,running,85.5,normal', // 設備ID,稼働状態,稼働率,診断結果
'Machine002,idle,0.0,maintenance',
'Machine003,running,92.3,warning',
'Machine004,error,0.0,alert'
];
// データの構造化
final statusReport = machineStatus.map((status) {
final parts = status.split(',');
return {
'machine_id': parts[0],
'status': parts[1],
'efficiency': double.parse(parts[2]),
'diagnosis': parts[3]
};
}).where((machine) => machine['diagnosis'] != 'normal')
.toList();
// 異常のある設備のレポート生成
for (var machine in statusReport) {
print('設備ID: ${machine['machine_id']}');
print('状態: ${machine['status']}');
print('診断: ${machine['diagnosis']}\n');
}
}
実行結果:
void main() {
// 設備からのステータスデータ
final List<String> machineStatus = [
'Machine001,running,85.5,normal', // 設備ID,稼働状態,稼働率,診断結果
'Machine002,idle,0.0,maintenance',
'Machine003,running,92.3,warning',
'Machine004,error,0.0,alert'
];
// データの構造化
final statusReport = machineStatus.map((status) {
final parts = status.split(',');
return {
'machine_id': parts[0],
'status': parts[1],
'efficiency': double.parse(parts[2]),
'diagnosis': parts[3]
};
}).where((machine) => machine['diagnosis'] != 'normal')
.toList();
// 異常のある設備のレポート生成
for (var machine in statusReport) {
print('設備ID: ${machine['machine_id']}');
print('状態: ${machine['status']}');
print('診断: ${machine['diagnosis']}\n');
}
}
この方法のメリット
-
データの構造化
- 文字列形式のデータを扱いやすいMap形式に変換
- キーと値の関係が明確で、コードの可読性が向上
- 型安全性の確保が容易
-
処理の効率化
- mapメソッドによる一括処理で冗長なループを回避
- メモリ効率の良い処理が可能
- チェーンメソッドによる柔軟な処理の追加
-
保守性の向上
- データ構造の変更に強い設計が可能
- ユニットテストが書きやすい
- コードの再利用性が高い
実装時の注意点
- エラーハンドリング
final processedData = sensorData.map((reading) {
try {
final parts = reading.split(',');
return {
'timestamp': parts[0],
'value': double.parse(parts[1])
};
} catch (e) {
print('データ処理エラー: $reading');
return null;
}
}).where((data) => data != null).toList();
- データのバリデーション
if (parts.length != 4) {
throw FormatException('不正なデータ形式: ${parts.length}項目');
}
まとめ
split()とmap()の組み合わせは、IoTアプリケーションでのデータ処理に非常に効果的です。特に:
- センサーデータの構造化
- リアルタイムモニタリング
- アラート条件の検知
- レポート生成
といったユースケースで真価を発揮します。
実装時はエラーハンドリングとバリデーションを適切に行い、堅牢なアプリケーションを構築することが重要です。
Discussion