2017-09-27 13 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

ブリリアント。完全にエラーはコンソールのすべてをチェックします。ある時点では、出力をデータフレームに置くか、スキップする行(つまり行が抜けている行)だけを読み出すように並べ替えるつもりです。ありがとう! – Jeff

1

私は、以下の2つの機能が、あなたが望む/必要とすることができると信じています。
最初に、2行目の空白を含むファイルを特定する機能。

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) 
} 

次に、このような行を含むファイルを1つずつ読み込む機能。最初の行は列ヘッダーであり、少なくとも2行目は空白のままであることを前提としています。他の引数を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 
関連する問題