2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2019-11-11

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

#2.キャンパスを開き、拡張インプットノードを作成
拡張インプットノードを開き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

このRコードをRシンタックスに貼り付け、プレビューをクリックします。
image.png

以下のようにすべてのCSVファイルを読み込んでまとめてくれます。
image.png

またデータ型を確認すると文字列と整数型を正しく設定しています。
image.png

この後は通常のストリームを作ることができます。
image.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

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?