SPSS Modelerでフォルダ内のCSVを一括で読み込む（拡張ノード版）

SPSS Modelerでフォルダ内のCSVを一括で読みたいことがあります。
以前以下の記事でModelerスクリプトでこれを実現しました。
SPSS Modelerでフォルダ内のCSVを一括で読み込む（Modelerスクリプト版）
https://qiita.com/kawada2017/items/b2a3c40a919b4371eb47

今回はこれを拡張ノードをつかって実現しました。

■テスト環境
Modeler 18.2.1
R3.3.3
Rの連携のセットアップが必要です。
SPSS Modelerの拡張ノードでRを利用する
https://qiita.com/kawada2017/items/0bb68e0b577e02bb8c6a


#1.フォルダ内にcsvを配置する

以下のように一つのフォルダに同じ列を持つcsvを配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/964fb546-ac53-bd44-3465-c47ce41ad954.png)

#2.キャンパスを開き、拡張インプットノードを作成
拡張インプットノードを開きRシンタックスに以下のRコードを入力します。

```R
targetPath<-'C:/data/test'

### This function automatically generates the dataModel
getMetaData <- function (data) {
  if(is.null(dim(data)))
    stop("Invalid data received: not a data.frame")
  if (dim(data)[1]<=0) {
    print("Warning : modelerData has no line, all fieldStorage fields set to strings")
    getStorage <- function(x){return("string")}
  } else {
    getStorage <- function(x) {
      x <- unlist(x)
      res <- NULL
      #if x is a factor, typeof will return 'integer' so we handle this case first
      if(is.factor(x)) {
        res <- "string"
      } else {
        res <- switch(typeof(x),
                      integer="integer",
                      double = "real",
                      "string")
      }
      return (res)
    }
  }
  col = vector("list", dim(data)[2])
  for (i in 1:dim(data)[2]) {
    col[[i]] <- c(fieldName=names(data[i]),
                  fieldLabel="",
                  fieldStorage=getStorage(data[i]),
                  fieldMeasure="",
                  fieldFormat="",
                  fieldRole="")
  }
  mdm<-do.call(cbind,col)
  mdm<-data.frame(mdm)
  return(mdm)
}

### Reading multiple csv files

fnames <- list.files(targetPath, full.names = T)
head(fnames)
modelerData<-do.call(rbind, lapply(fnames, read.table, sep=",", skip=0, quote = '\'',header=T, stringsAsFactors=F, encoding="ms932"))
#head(modelerData)
modelerDataModel <- getMetaData(modelerData)
#print(modelerDataModel)
```

* targetPathが一括処理をするCSVが入ったフォルダになります。
* list.filesでtargetPathのファイル名をリストを取得しています。
* read.tableをdo.callで取得したファイル分実行してファイルを読み込んでいます。なお、今回はencoding="ms932"にしていますので、* ShiftJISのデータを読み込んでいます。
* getMetaData というfunctionではデータ型を判定しています。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/46b0077a-a6f1-1ccd-ee1e-e40103d64437.png)

このRコードをRシンタックスに貼り付け、プレビューをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/24e1990c-dbbc-f655-d25a-a97c351a49ea.png)


以下のようにすべてのCSVファイルを読み込んでまとめてくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/b1766745-ebd5-b41d-43f4-bfda8cf728fc.png)

またデータ型を確認すると文字列と整数型を正しく設定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/b2624d93-f9c1-d0a3-2a76-a8401025273b.png)


この後は通常のストリームを作ることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/4fba94f8-eb92-009d-a216-43401713b361.png)

Modelerスクリプト版との違いは、ファイルが増えたり変わったりしていた場合にも、毎回スクリプトを実行しなくてもよいということになります。

# 参考
Rで複数のCSVを1つのデータフレームに読み込む - 闘うITエンジニアの覚え書き
https://www.magata.net/memo/index.php?R%A4%C7%CA%A3%BF%F4%A4%CECSV%A4%F21%A4%C4%A4%CE%A5%C7%A1%BC%A5%BF%A5%D5%A5%EC%A1%BC%A5%E0%A4%CB%C6%C9%A4%DF%B9%FE%A4%E0