Чтение ломаных CSV-строк из R - PullRequest
2 голосов
/ 09 мая 2019

Мне нужно прочитать CSV-файл, который по некоторым причинам имеет разбитые строки.Около 60000 строк, и некоторые из них просто оторваны от предыдущих строк.Я хотел бы узнать, как я могу прочитать таблицу и преобразовать ее в правильный фрейм данных с

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

Iя заметил, что неправильные строки начинаются с запятой

Я бы хотел очистить их следующим образом:

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 ]

3 голосов
/ 09 мая 2019

Самый простой способ - прочитать содержимое CSV в виде строки из одного символа, используя readr s read_file, а затем заменить шаблон newline + запятую запятой:

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  
2 голосов
/ 09 мая 2019

Возможно, есть несколько способов сделать это ..

ОБНОВЛЕНИЕ: Попробуйте это тогда. С аргументом 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


1 голос
/ 10 мая 2019

Простое решение с использованием базы R: читать с использованием readLines, пропустить первые 6 и обрабатывать далее:

dat = readLines('your_file')
dat = dat[7:length(dat)]
csv_dat = read.csv(textConnection(dat[!grepl("^,",dat)]))
1 голос
/ 09 мая 2019

Другие решения, вероятно, лучше, но вы также можете использовать чудовищный фрагмент кода функции, подобный этому (это в значительной степени зависит от остальных ваших данных, следующих вашему образцу данных):

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...