Чтение CSV-файла, цикл по строкам, использование соединений - PullRequest
0 голосов
/ 24 октября 2018

Итак, у меня есть большой файл CSV Excel, который мой компьютер не может обработать открытие без завершения rstudio.

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

Этого я обычно могу достичь (например, для файла меньшего размера), просто прочитав и сохранив весь CSV-файл в Rstudio и запустив простой цикл for.

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

(я думаю, что это имеет смысл)

Это было предложено: здесь

Мне удалось заставить мои расчеты быть быстро прочитанными и работать для первой строки моего файла данных.

Это циклы, с которыми я борюсь,поскольку я пытаюсь использовать цикл for (потенциально должен использовать оператор while / if), но у меня нет места для вызова значения «i» из цикла: часть моего кода ниже:

con = file(FileName, "r")
  for (row in 1:nrow(con)) {
    data <- read.csv(con, nrow=1) #reading of file
 "insert calculations here"
}

Итак, "row" - это нне вызывается, поэтому цикл проходит только один раз.У меня также есть проблема с "1:nrow(con)", поскольку nrow(con) просто возвращает NULL

Любая помощь с этим была бы большой, спасибо.

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

read.csv() выдаст ошибку, если попытается прочитать после конца файла.Таким образом, вы могли бы сделать что-то вроде этого:

con <- file(FileName, "rt")
repeat {
   data <- try(read.csv(con, nrow = 1, header = FALSE), silent = TRUE) #reading of file
   if (inherits(data, "try-error")) break
   "insert calculations here"
}
close(con)

Это будет очень медленный переход по одной строке за раз, но вы можете делать это большими партиями, если ваш код расчета поддерживает это.И я бы порекомендовал указывать типы столбцов с помощью colClasses в вызове read.csv(), чтобы R иногда не угадывал иначе.

Отредактировано, чтобы добавить:

Мы былисказал, что в наборе данных есть 3000 столбцов целых чисел.Первая строка имеет только частичную информацию заголовка.Этот код может справиться с этим:

n <- 1                           # desired batch size
col.names <- paste0("C", 1:3000) # desired column names
con <- file(FileName, "rt")
readLines(con, 1)                # Skip over bad header row
repeat {

   data <- try(read.csv(con, nrow = n, header = FALSE,
                        col.names = col.names,
                        colClasses = "integer"), 
               silent = TRUE) #reading of file
   if (inherits(data, "try-error")) break
   "insert calculations here"
}
close(con)
0 голосов
/ 24 октября 2018

Вы можете читать ваши данные в пакетах, скажем, по 10000 строк за раз (но вы можете изменить n, чтобы сделать столько, сколько хотите), выполнить свои вычисления и затем записать изменения в новый файл, добавивкаждая партия до конца файла.

Что-то вроде:

i = 0
n = 10000

while (TRUE) {
    df = readr::read_csv('my_file.csv', skip=i, n_max=n)
    # If the number of rows in the file is divisible by n, it may be the case
    # that the next pass will result in an empty data.frame being returned
    if (nrow(df) > 0) {
        # do your calculations
        # If you have performed calculations on df and want to save those results,
        # save the data.frame to a file, appending it to the file to avoid overwriting prior results.
        readr::write_csv(df, 'my_new_file.csv', append=TRUE)
    } else {
        break
    }

    # Check to see if we need to keep going, if so add n to i
    if (nrow(df) < n) {
        break
    } else {
        i = i + n
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...