2013年3月30日土曜日

デジカメでよく使う焦点距離を調べる (2) LINQtoCSVでデータ処理

まえおき

各カメラについて焦点距離ごとの撮影枚数をカウントしてみました。



CSVファイルの処理に際しては、LINQの練習も兼ねて
LINQ to CSV libraryを利用してみました。


前準備

CSVファイルの準備

使用したCSVファイルは、以下の通り。(前回作成したものを少し改変)

  • タブ区切り
  • データは「ファイル名、カメラ名、タイムスタンプ、焦点距離、35mm判換算焦点距離、null」の6つ
    • 6列目にnullがあるのは、前回作成したコードが手抜きのため

LINQtoCSVライブラリの利用

ライブラリの利用にあたっては、
LINQ to CSV 、結構いいかも | kamepress の記事を参考にさせて頂きました。
ライブラリの使用手順は概ね以下の通り。
  1. パッケージマネージャで
    Install-Package LinqToCsv
  2. CSVファイルの何列目に何のデータが入っているか、を示すデータクラスを作成
    (下記コードにおけるExifMiniクラス)
  3. CSVファイルを操作したい箇所において
    1. CsvFileDescription オブジェクトを作成
    2. 作成したCsvFileDescriptionオブジェクトを引数としてCsvContext オブジェクトを作成
    3. 作成したCsvContext オブジェクトのメソッド(Readなど)を使う

作成したコード

概要

  • LX2で撮影したデータを取得 (CameraDataに格納)
  • LX2で撮影したデータから焦点距離の一覧を取得 (focalLengths に格納)
  • 各焦点距離ごとにデータ数を取得
  • CSVファイルに書き出し

コード


はまったところ

公式ドキュメントをよく読まずになんとなくで動かしたら、
エラーメッセージがちょっと謎なエラーが発生して悩まされました(*)
(*) ドキュメントを一通り読み直したところ下記の注意点は各所に書いてありました。

以下、自分がはまった点です。
  • CSVファイルの列数と、データクラスに定義する列数が一致させる必要あり
    (列の定義が足りていないと実行時にエラー発生)
    • 今回の例で言うと、データクラスにCSVファイルの6行目(null)に対応する定義が必要
  • データが欠けている場合にはデータクラスに下記の指定が必要
    • CanBeNull = true
  • データクラスで指定した型と、
    実際のCSVファイルのデータの形式が合わない場合はエラーが発生
    • 今回の例で言うと、
      CSVファイルの3列目(タイムスタンプの形式)はC#のDateTime型と合わないため、
      データクラスで3列目にDateTime型を指定するとエラーが発生
  • CSVファイルの先頭にヘッダがない場合は、
    CsvFileDescriptionオブジェクトに以下の2つを指定する必要あり
    (片方だけ指定するとエラー発生)
    • EnforceCsvColumnAttribute = true
    • FirstLineHasColumnNames = false
LINQtoCSVライブラリは、
CSVファイルには欠陥がないことを前提としているようで、
少しでもデータクラスに合わないデータが存在すると簡単にエラーが発生します。
このため、データの欠損などが生じないように
あらかじめCSVファイル作成時に気を付けるのがいいのかなぁと思います。

LINQtoCSVライブラリは、CSVファイルを手軽に扱える点は物凄く良いのですが

自分的には、各種のパラメータが
初見では動作にどういう影響を与えるのかわからないものがあり、
けっこうアクが強い印象を受けました。

(個人的には、フェールスルーな設計にして欲しかったなぁ、と思ったり…。)

利用にあたってはあらかじめドキュメントをよく読んだ方が、
後々詰まなくて済む分、楽かもしれません。

出力結果

今回の出力結果をExcelでまとめたものがこちら。



横軸は、35mm判換算の焦点距離です。
データを見た感じでは、
  • 主に、広角側(28~35mm)を使っていた。
  • たまに、望遠側(110mm, 136mm)を使ってた。
  • 標準画角(50mm前後)は、ほとんど使ってない。
最近は、一眼レフでもっぱら中望遠レンズを使っているのですが、
この結果を見ると、広角レンズを買い足してもいいのかもなぁと思ったりします。

それにしても広角側での撮影がやたら多いなぁ。。。

次回は、機種ごとではなく
時系列で焦点距離の使用頻度を可視化してみたいと思います。