2017-12-21 2 views
2

나는 이것이 일부 행이 예를 들어읽기 세미콜론 구분자로 문자열에 표시되는 파일을 구분

(I이 원인 모를) 텍스트 문자열 내부에 별도의 세미콜론을 포함하는 파일을 읽으려고 해요 같은 문제 슈퍼 단순화 된 데이터 :

bad_data <- "100; Mc Donalds; Seattle; normal day 
      115; Starbucks; Boston; normal day 
      400; PF Chang; Chicago; busy day 
      400;; Texas; busy day 
      10; D;unkin Donuts; Washin;gton; lazy day" 

은 그래서 더 헤더가없는 나는 그것을 읽으려고 : 읽기 ...이 좀 불가능

library(data.table) 
fread(bad_data, sep = ";", header = F, na.strings = c("", NA), strip.white = T) 

하지만 시가 I 깨끗한 해결책이 없다면 그냥 그 행을 건너 뛰고 싶습니다.

+1

분할 b y'; '(세미콜론 + 공백)? – A5C1D2H2I1M1N2O1R2T1

+0

모든 필드에 세미콜론 다음에 공백이있는 것은 아닙니다. ( – pachamaltese

+0

필드가 누락 된 텍사스 항목을 의미할까요? 아니면 일반적으로 ... – A5C1D2H2I1M1N2O1R2T1

답변

1

당신은 당신이 구분 기호의 예상 번호가없는 경우 행을 삭제하려면 :

library(stringi) 
library(magrittr) 

bad_data <- 
"100; Mc Donalds; Seattle; normal day 
115; Starbucks; Boston; normal day 
400; PF Chang; Chicago; busy day 
400;; Texas; busy day 
10; D;unkin Donuts; Washin;gton; lazy day" 

# split to lines. you could also use readLines if it's coming from a file 
text_lines <- unlist(strsplit(bad_data, '\n')) 

# which lines contain the expected number of semicolons? 
good_lines <- sapply(text_lines, function(x) stri_count_fixed(x, ';') == 3) 

# for those lines, split to vectors and (optional bonus) trim whitespace 
good_vectors <- lapply(
    text_lines[good_lines], 
    function(x) x %>% strsplit(';') %>% unlist %>% trimws) 

# flatten to matrix (from which you can make a data.frame or whatever you want) 
my_mat <- do.call(rbind, good_vectors) 

결과 :

> my_mat 
    [,1] [,2]   [,3]  [,4]   
[1,] "100" "Mc Donalds" "Seattle" "normal day" 
[2,] "115" "Starbucks" "Boston" "normal day" 
[3,] "400" "PF Chang" "Chicago" "busy day" 
[4,] "400" ""   "Texas" "busy day" 
+0

데이터가 너무 커서 메모리에 들어가기가 힘들다면 커맨드 라인에서'sed '또는 무엇인가로 이것을 수행하는 것이 더 깔끔할 수 있지만 위 예제는 예제 데이터에서 작동합니다 – arvi1000

1

당신은 세미콜론을 모두 제거 시도 할 수 내부 텍스트 문자열 (원하지 않는 모든 세미콜론이 완전히 문자열 안에 있다고 가정합니다.

gsub("(\\S);(\\S)", "\\1\\2", bad_data, perl=TRUE) 
[1] "100; Mc Donalds; Seattle; normal day\n    115; Starbucks; Boston; normal day\n    400; PF Chang; Chicago; busy day\n    400; Texas; busy day\n    10; Dunkin Donuts; Washington; lazy day" 
관련 문제