从R读取损坏的CSV行

时间:2019-05-09 07:10:56

标签: r csv dataframe

由于某些原因,我需要读取包含断行的csv文件。该行大约有60,000行,而其中的一些行刚从以前的原始行中断开。 我想找到如何使用

读取表格并将其转换为正确的数据框的方法
I am reading the file this way: 
All_transactions <- read.csv(paste("/Users/Match/Data/MenuReport/", 04-01-new_file.csv, sep=""), skip=6, sep=",")

我跳过了包含随机文本的前6行。

Product,Date,Quantity,Categorie,sector
ABC, 01052019, 4510, Food, Dry
CDE, 01052019, 222, Drink
, Cold
FGH, 01052019, 345, Food, Dry
IJK, 01052019, 234, Food
, Cold

我确实注意到错误的行似乎以逗号开头

我希望能够通过以下方式进行清洁:

Product,Date,Quantity,Categorie,sector
ABC, 01052019, 4510, Food, Dry
CDE, 01052019, 222, Drink, Cold
FGH, 01052019, 345, Food, Dry
IJK, 01052019, 234, Food, Cold

然后将它们放在数据框中。

4 个答案:

答案 0 :(得分:3)

最简单的方法是使用readr s read_file作为单个字符串读入CSV的内容,然后用逗号替换模式换行符+逗号:

library(readr)

# Read in broken CSV as single character string.
file_string <- read_file("broken_csv.csv")

# Replace patter `\\n,` with `,`, then read string as CSV.
df <- read_csv(gsub("\\n,", ",", file_string), skip = 6)

df

#### OUTPUT ####

# A tibble: 4 x 5
  Product Date     Quantity Categorie sector
  <chr>   <chr>       <dbl> <chr>     <chr> 
1 ABC     01052019     4510 Food      Dry   
2 CDE     01052019      222 Drink     Cold  
3 FGH     01052019      345 Food      Dry   
4 IJK     01052019      234 Food      Cold  

答案 1 :(得分:2)

大概有几种方法可以做到这一点。

更新:然后尝试此操作。使用skip=中的scan()参数,您可以指定要跳过的行数。



file <- scan("C:/Users/skupfer/Documents/bisher.txt", strip.white = TRUE, sep = ",",
             what = list("character"), skip = 1)

file_mat <- matrix(file[[1]][file[[1]] != ""], ncol = 5, byrow = TRUE)

file_df <- as.data.frame(file_mat, stringsAsFactors = FALSE)

file_df$Quantity <- as.integer(file_mat[,3])

> file_df
  Product     Date Quantity Categorie sector
1     ABC 01052019     4510      Food    Dry
2     CDE 01052019      222     Drink   Cold
3     FGH 01052019      345      Food    Dry
4     IJK 01052019      234      Food   Cold


答案 2 :(得分:1)

其他解决方案可能更好,但是您也可以使用像这样的巨大功能代码(这在很大程度上取决于示例数据模式下的其余数据):

library(readr)

df <- read_csv(file = "YOUR_FILE", skip = 6)
df

process_df <- function(x) {
  for (row in 1:nrow(x)) {
    if(sum(is.na(x[row,]) == 1)) {
      if (rowSums(!is.na(x[row+1,])) == 1) {
        x[row, which(is.na(x[row,]))] <- x[row+1,which(!is.na(x[3,]))]
      }
    }
  }
  x <- x[rowSums(!is.na(x[,])) > 1,]
  return(x)
}

process_df(df)

答案 3 :(得分:1)

使用基数R的简单解决方案: 使用readLines阅读,跳过前6个,然后进一步处理:

dat = readLines('your_file')
dat = dat[7:length(dat)]
csv_dat = read.csv(textConnection(dat[!grepl("^,",dat)]))