🏭

map splitを組み合わせる 

2025/01/07に公開

💡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');
  }
}

この方法のメリット

  1. データの構造化

    • 文字列形式のデータを扱いやすいMap形式に変換
    • キーと値の関係が明確で、コードの可読性が向上
    • 型安全性の確保が容易
  2. 処理の効率化

    • mapメソッドによる一括処理で冗長なループを回避
    • メモリ効率の良い処理が可能
    • チェーンメソッドによる柔軟な処理の追加
  3. 保守性の向上

    • データ構造の変更に強い設計が可能
    • ユニットテストが書きやすい
    • コードの再利用性が高い

実装時の注意点

  1. エラーハンドリング
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();
  1. データのバリデーション
if (parts.length != 4) {
  throw FormatException('不正なデータ形式: ${parts.length}項目');
}

まとめ

split()とmap()の組み合わせは、IoTアプリケーションでのデータ処理に非常に効果的です。特に:

  • センサーデータの構造化
  • リアルタイムモニタリング
  • アラート条件の検知
  • レポート生成

といったユースケースで真価を発揮します。

実装時はエラーハンドリングとバリデーションを適切に行い、堅牢なアプリケーションを構築することが重要です。

Discussion