2013年11月18日月曜日

開発環境

初めてのコンピュータサイエンス(Jennifer CampbellPaul GriesJason MontojoGreg Wilson(著)長尾 高弘(翻訳))の8章(ファイル処理)、8.8(練習問題)、3.をDartで解いてみる。

その他参考書籍

8.8(練習問題)、3.

コード

sample.dart

import 'dart:html';

void main(){
  var run = querySelector('#run'),
      clear = querySelector('#clear'),
      pre0 = querySelector('#pre0'),
      reader = new FileReader();
  InputElement input = querySelector('#f0');
  input.accept = 'text/*';
  run.onClick.listen((MouseEvent event){
    var result = window.navigator.userAgent + '\n';
    try {
      File file = input.files[0];
      reader.readAsText(file);
      reader.onLoad.listen((Event event){
        String text = reader.result;
        result += '元のテキスト\n';
        result += '$text\n';
        for (var item in readWeatherData(text, fields)){
          result += '$item\n';
        }
        result += 'ラッパー関数\n';
        for (var item in readWeatherDataWrapper(text)){
          result += '$item\n';
        }
        pre0.text = result;
      });
    } catch (e){
      result += e.toString();
      pre0.text = result;
    }
  });
  clear.onClick.listen((MouseEvent event) => pre0.text = '');
}

List<List<List>> fields = [[[4, 'int'], [2, 'int'], [2, 'int']],
                           [[2, 'int'], [2, 'int'], [2, 'int']],
                           [[2, 'int'], [2, 'int'], [2, 'int']],
                           [[6, 'double'], [6, 'double'], [6, 'double']]];

List<List<List<num>>> readWeatherDataWrapper(String s){
  List<List<List>> fields =
      [[[0, 'int'], [4, 'int'], [6, 'int']],
       [[8, 'int'], [10, 'int'], [12, 'int']],
       [[14, 'int'], [16, 'int'], [18, 'int']],
       [[20, 'double'], [26, 'double'], [32, 'dobule']]];
  List<List<List>> new_fields = [];
  List<List> new_field = [];
  bool flag1 = true;
  int temp_i = 0;
  String temp_target_type = '';
  for (List<List> field in fields){
    bool flag2 = true;
    for (List group in field){
      int i = group[0];
      String target_type = group[1];
      if (flag1){
        flag1 = false;
        flag2 = false;
      } else {
        new_field.add([i - temp_i, temp_target_type]);
        if (flag2){
          new_fields.add(new_field);
          new_field = [];
          flag2 = false;
        }
      }
      temp_i = i;
      temp_target_type = target_type;
    }
  }
  List<String> lines = s.split('\n');
  new_field.add([lines.first.length - temp_i, temp_target_type]);
  new_fields.add(new_field);
  return readWeatherData(s, new_fields);
}

List<List<List<num>>> readWeatherData(String s, List<List<List>> fields){
  List<List<List<num>>> result = [];
  s = s.trim();
  List<String> lines = s.split('\n');
  for(String line in lines){
    int start = 0;
    List record = [];
    for(List field in fields){
      List<num> group = [];
      for (List f in field){
        int width = f[0];
        String t = f[1];
        String text = line.substring(start, start + width);
        num value = t == 'int' ? int.parse(text) : double.parse(text);
        group.add(value);
        start += width;
      }
      record.add(group);
    }
    result.add(record);
  }
  return result;
}















						

0 コメント:

コメントを投稿