2017-09-27 9 views
0

.csv 형식의 파일 폴더가 있습니다. 그들은 빈 줄이 필요합니다 (이는 LiDAR 장치의 측정 값이 없음을 나타냅니다. 이는 양호하고 체재해야 함). 그러나 때때로 첫 번째 행이 비어있어 코드와 패키지를 버리고 모든 것이 중단됩니다.첫 번째 행이 누락 된 디렉토리의 모든 파일을 빠르게 찾으려면 어떻게합니까?

지금 당장 저는 .csv 파일을 열고 첫 줄이 비어 있는지 확인해야합니다.

나는 다음 중 하나를 수행 좋아하지만 손실에 나는 것입니다 방법에 대해

1) 신속하게 디렉토리에있는 모든 파일을 통해 스캔 한 사람이 누락 저를 알려주는 코드를 작성 첫 번째 줄

2) 단지 시작에있는 빈 줄 건너 뛸 수 - 다를 수 있습니다 때로는 한 줄 이상은

3) 코드가 비어 그 모두를 통해 순환합니다. csv 파일을 만들고 첫 번째 줄 번호를 삽입하여 파일에 아무런 문제가 없도록합니다.

감사합니다.

+0

지금까지 해보신 것은 무엇입니까? [좋은 질문을하는 법] (http://stackoverflow.com/help/how-to-ask) 및 [재현 가능한 예] (http://stackoverflow.com/questions/)에 대한 정보를 읽어보십시오. 5963269/how-to-make-a-great-r-reproducible-example/5963610 참조). 이렇게하면 다른 사람들이 당신을 도울 수있게됩니다. – Jaap

+0

각 파일을'read.csv'로 읽는 대신'readLines'를 사용하여 10 줄을 읽으십시오. 몇 줄의 빈 줄이 있는지 계산하고'read.csv'를 사용하여 적절한 줄 수. –

+0

@AndrewGustar의 의견을 보았습니다. 이것이 바로 아래의 코드입니다. –

답변

2

위의 1과 2에 해당하는 코드가 있습니다. 왜 1과 2를 할 수있는 능력이 주어지면 더미 라인을 삽입하고 싶지는 모르겠습니다. 그것은 간단하지만 일반적으로 원시 데이터 파일을 수정하는 것은 좋지 않습니다.

# Create some test files 
cat("x,y", "1,2", sep="\n", file = "blank0.csv") 
cat("", "x,y", "1,2", sep="\n", file = "blank1.csv") 
cat("", "", "x,y", "1,2", sep="\n", file = "blank2.csv") 


files <- list.files(pattern = "*.csv", full.names = TRUE) 

for(i in seq_along(files)) { 
    filedata <- readLines(files[i]) 
    lines_to_skip <- min(which(filedata != "")) - 1 
    cat(i, files[i], lines_to_skip, "\n") 
    x <- read.csv(files[i], skip = lines_to_skip) 
} 

1 ./blank0.csv 0 
2 ./blank1.csv 1 
3 ./blank2.csv 2 

을 인쇄하고 정확하게 각 데이터 세트에서 읽습니다.

+0

Brilliant. 콘솔에서 모든 오류를 완전히 검사합니다.어떤 시점에서 나는 출력을 데이터 프레임이나 건너 뛸 줄이있는 것들 (즉 행이 누락 된 행) 만 읽도록 정렬하려고합니다. 감사! – Jeff

1

나는 두 가지 기능을 통해 원하는 것을 할 수 있다고 생각합니다.
먼저 두 번째 줄이 공백 인 파일을 확인하는 기능입니다.

second_blank <- function(path = ".", pattern = "\\.csv"){ 
    fls <- list.files(path = path, pattern = pattern) 
    second <- sapply(fls, function(f) readLines(f, n = 2)[2]) 
    which(nchar(gsub(",", "", second)) == 0) 
} 

그런 다음 해당 줄이있는 파일을 한 번에 하나씩 읽는 기능. 첫 번째 줄은 열 머리글이고 적어도 두 번째 줄은 비어 있다고 가정합니다. 도트 인수 ...이 있으며 다른 인수를 read.table에 전달할 수 있습니다 (예 : stringsAsFactors = FALSE).

skip_blank <- function(file, ...){ 
    header <- readLines(file, n = 1) 
    header <- strsplit(header, ",")[[1]] 
    count <- 1L 
    while(TRUE){ 
     txt <- scan(file, what = "character", skip = count, nlines = 1) 
     if(nchar(gsub(",", "", txt)) > 0) break 
     count <- count + 1L 
    } 
    dat <- read.table(file, skip = count, header = TRUE, sep = ",", dec = ".", fill = TRUE, ...) 
    names(dat) <- header 
    dat 
} 

이제 예제 사용법.

second_blank(pattern = "csv") # a first run as an example usage 
inx <- second_blank()   # this will be needed later 

fl_names <- list.files(pattern = "\\.csv") # get all the CSV files 

df_list <- lapply(fl_names[inx], skip_blank) # read the problem ones 
names(df_list) <- fl_names[inx]    # tidy up the result list 
df_list