いいもんつくったー

複数の列でセル改行されているcsvファイルを行分割するツール作った

度々物議をかもすExcelのセル結合やセル改行。
何度お願いだからセルのマージだけはやめてと言っても辞めてくれないのが人間の性。
挙句の果てにセル結合の解除や改行セルの分割がデータサイエンティストの仕事になってしまったりするのです。

解決方法

そこで今回はセル改行に焦点を当てて、セル改行されているcsvファイルをセル分割するツールを作りました。
(今後なんとかしてセル結合問題も解いていきたいが、仕様決めが結構難しい。。)
使い勝手はこんな感じです。

  1. セル改行されているcsvを読み込む
  2. inputタブで読み込まれたファイル確認
  3. outputタブで改行が分割されたデータを確認
  4. データ出力

使い方

普段Rを使わない方はちょっとだけ前準備が必要です。

  1. Rstudioをインストール
  2. 下記おまじないをRstudioのコンソールに打ち込んで、ライブラリをインストール
install.packages("shiny")
install.packages("DT")
install.packages("tidyverse")

3.下記おまじないをRstudioのコンソールに打ち込んで、ツールの実行

library(shiny)
runUrl("https://github.com/Ry87/SeparateCellsApp/archive/master.tar.gz")

コード

下記に置いてますが、R・Shiny話す方向けにコード解説もしておきます。
github.com

#ライブラリの宣言
library(DT)
library(tidyverse)


shinyServer(function(input, output) {

#ui.Rとの関連付け
  output$input <- DT::renderDataTable(inputData(),selection = list(target='column'))
  output$output <- DT::renderDataTable(outputData(),selection = list(target='column'))
  
#csvデータの読み込み&表示
  inputData <- reactive({if(is.null(input$inputFile)) return(NULL)
    read.csv(input$inputFile$datapath,row.names=1, header = TRUE, sep=",")
  })
  
#セル分割後のデータ表示
  outputData <- reactive({
    GetOutputData()
  })
  
#セル分割後のデータ取得
  GetOutputData <- function(){
    data <- inputData()
    if(is.null(inputData())){return(NULL)}
    mergedCellColumns <- FindMergedCellColumns(data)
    if(is.null(mergedCellColumns)){return(NULL)}
 #セルを分割
    for(col in mergedCellColumns){
      data <- data %>%tidyr::separate_rows(col,sep = "\n")
    }
    return(data)
  }
  
#セル分割されている列名を取得するための関数
  FindMergedCellColumns <- function(data){
 #列データをループして列ごとにセルが分割されているかを取得
    hasMergedCell <- sapply(data, function(x){any(str_detect(x,pattern="\n"))})
    #セル分割されている列の列名を取得
    mergedCellColumns <- names(which(hasMergedCell==TRUE))
    return(mergedCellColumns)
  }
  
#セル分割後のデータ出力
  output$outputExport <- downloadHandler(
    filename = "output.csv",
    content = function(file) {
      write.csv(GetOutputData(), file)
    })
})