複数の列でセル改行されているcsvファイルを行分割するツール作った
度々物議をかもすExcelのセル結合やセル改行。
何度お願いだからセルのマージだけはやめてと言っても辞めてくれないのが人間の性。
挙句の果てにセル結合の解除や改行セルの分割がデータサイエンティストの仕事になってしまったりするのです。
解決方法
そこで今回はセル改行に焦点を当てて、セル改行されているcsvファイルをセル分割するツールを作りました。
(今後なんとかしてセル結合問題も解いていきたいが、仕様決めが結構難しい。。)
使い勝手はこんな感じです。
- セル改行されているcsvを読み込む
- inputタブで読み込まれたファイル確認
- outputタブで改行が分割されたデータを確認
- データ出力
使い方
普段Rを使わない方はちょっとだけ前準備が必要です。
- Rstudioをインストール
- 下記おまじないを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) }) })