Sys.setlocale(category = "LC_ALL", locale = "cht") # for windows user
library(magrittr)
library(data.table)
library(zoo)

con <- file("date.txt", "r", blocking = FALSE)
d <- 
  readLines(con, encoding = "UTF-8") %>% # 讀入文字檔
  trimws %>%                             # 除去前後空白
  gsub(" +", " ", .) %>%                 # 除去多餘空白
  as.data.table %>%
  setnames(".", "rawTxt") %>%
  .[-1:-3]                               # 刪除前三列
close(con)

rowIDs1 <- grep("^標 準 別：", d$rawTxt)    # 找到「標準別」列
rowIDs2 <- which(!(1:nrow(d)) %in% rowIDs1) # 找到非「標準別」列

# 捉取並寫入「標準別」列的「標準別」欄
d[rowIDs1, 標準別 := gsub("標 準 別：", "", rawTxt)]
# 由上一個非NA值填入標準別
d[, 標準別 := na.locf(標準別)]

# 捉取並寫入非「標準別」列各欄
d[rowIDs2, 處置代碼 := tstrsplit(rawTxt, " ", keep = 1)]
d[rowIDs2, 處置名稱 := tstrsplit(rawTxt, " ", keep = 2)]
d[rowIDs2, 處置類別 := tstrsplit(rawTxt, " ", keep = 3)]
d[rowIDs2, 健保單價 := tstrsplit(rawTxt, " ", keep = 4)]
d[rowIDs2, 自費單價 := tstrsplit(rawTxt, " ", keep = 5)]

# 刪除「標準別」列
d <- d[rowIDs2]
# 刪除rawTxt
d[, rawTxt := NULL]
# 完工
print(d)
#              標準別 處置代碼                      處置名稱 處置類別 健保單價 自費單價
#   1:     030 診察費   10101A                    門診診察費      F11    80.00    80.00
#   2:     030 診察費    TR-IN              急診轉入醫院獎勵        F   500.00   500.00
#   3:     030 診察費   TR-OUT              急診轉出醫院獎勵        F   500.00   500.00
#   4:     030 診察費   10201B     急診診察費-檢傷分類第一級      F14  1800.00  1800.00
#   5:     030 診察費   10202B     急診診察費-檢傷分類第二級      F14  1000.00  1000.00
#  ---                                                                                 
# 117: 240 一般檢查費   E3031C             BI:SGPT(替代療法)      D01    50.00    50.00
# 118: 240 一般檢查費   E3032C             BI:r-GT(替代療法)      D01    70.00    70.00
# 119: 240 一般檢查費   E3034C      愛滋病毒篩檢暨衛教諮詢費      D01   225.00   225.00
# 120: 240 一般檢查費 E3034C-1 愛滋病毒篩檢費-自付差額(複診)      D01    15.00    15.00
# 121: 240 一般檢查費   E3037C   C型肝炎病毒抗體檢驗暨諮詢費      D01   350.00   350.00

# 轉存CSV檔
d %>% as.data.frame %>% write.csv(., "dateNew2.csv", fileEncoding = "UTF-8")
