2014年8月29日金曜日

Rで空のCSVファイルを読み込むとエラーが出てしまう場合の対処方法

例えば、複数のCSVファイルがあって、それをまとめて処理したいとしましょう。

"001.csv"は、

  taro,60
  hanako,100
  ichiro,90
  ...


"002.csv"は

  jiro,50
  keiko,70
  ...


みたいな感じでたくさんのCSVファイルがあって、それぞれを集計したいとか、全部をマージしたいとか、そんな場合。

以下のようなコードで処理しようとするんじゃないでしょうか、

files <- dir(pattern="\\.csv")
 
for(f in files){
  data <- read.csv(f, header=F)
 
  # このあとデータを集計するような処理
}


普通は上記でうまくいくんですが、たまに変なファイルが混じってたりする。

例えば、空のCSVファイルとか。

すると、

 以下にエラー read.table(file = file, header = header, sep = sep, quote = quote,  :
   入力中には利用可能な行がありません


というエラーメッセージが出て、処理が中断してしまいます。

人名と点数のデータみたいなものだと空のファイルなんてのは考えにくいですが、「複数の画像から顔検出して、検出位置の座標をCSVで出力」みたいな場合だと、不検出の場合は空のファイルができあがっている、なんてことはよくあります。

そういう場合の対処方法としては、try関数を使うと便利です。

for(f in files){
  # read.csvでエラーが出たかどうかはresに設定される
  res <- try ( data <- read.csv(f, header=F), silent=T )
 
  if( class(res) != "try-error" ) {
    # エラーが出なかったので、分析処理を続ける
    # ...
  } else {
    # 空のファイルがあったときの処理
    print("空のファイルがあったよ")
  }
}

try関数で囲んでおくと、エラーが出ても止まりません。エラーが出たかどうかは、resに設定されていますので、if文で処理を分けてやればOKですね。

silent=Fに変えると、発生したエラーメッセージを表示させる(処理は継続される)こともできます。




0 件のコメント:

コメントを投稿