由于某些原因,我需要读取包含断行的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
然后将它们放在数据框中。
答案 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)]))