Невозможно перечитать файл, несмотря на поиск () - PullRequest
2 голосов
/ 12 февраля 2020

Я не могу перечитать файл, несмотря на выполнение поиска () для начала файла

> con <- file("AJOVPH.csv", open="rt", encoding="utf-8")
> x<- readLines(con)
> seek(con,0)
[1] 1388
> x<- readLines(con)
> x
character(0)
> seek(con,0)
[1] 0
> read.csv(con, comment.char = "#", stringsAsFactors=FALSE)
Error in read.table(file = file, header = header, sep = sep, quote = quote,  : 
  no lines available in input
> 

Я ожидаю, что con вернется к началу, и я могу извлечь соответствующую информацию .

Ответы [ 2 ]

2 голосов
/ 12 февраля 2020

Ubuntu 19.10 с R 3.6.2 здесь.
Тестовый запуск ниже показывает, что можно seek открыть файл в открытом режиме "rt" и перечитать его.

Сначала создайте файл CSV.

out <- data.frame(colA = letters[1:5], colB = 1:5)
write.csv(out, "test.csv")

Теперь читайте, ищите, читайте.

f <- file("test.csv", open = "rt")
isSeekable(f)
#[1] TRUE

x1 <- readLines(f)
seek(f, where = 0, rw = "read", origin = "start")
#[1] 67
x2 <- readLines(f)
identical(x1, x2)
#[1] TRUE

close(f)

Можно ли это сделать также с помощью read.csv?

f <- file("test.csv", open = "rt")

df1 <- read.csv(f)
seek(f, where = 0, rw = "read", origin = "start")
#[1] 67
df2 <- read.csv(f)
identical(df1, df2)
#[1] TRUE

Да, может. Время убирать.

close(f)
unlink("test.csv")
1 голос
/ 12 февраля 2020

Вы не можете использовать seek, когда выбираете перекодировку текста в "UTF-8" в file

Это в файле справки для seek:

Ни один из них не должен работать на соединениях в текстовом режиме с выбранной перекодировкой.

Чтобы показать это, я могу повторить вашу проблему:

write.csv(data.frame(a = rnorm(5), b = letters[1:5]), "my.csv")

con <- file("my.csv", "rt", encoding = "UTF-8")
x   <- readLines(con)
seek(con, 0)
#> [1] 149
y   <- readLines(con)
close(con)
y
#> character(0)

И Я могу это исправить, запустив точно такой же код, за исключением удаления encoding = "UTF-8" из file():

write.csv(data.frame(a = rnorm(5), b = letters[1:5]), "my.csv")

con <- file("my.csv", "rt")
x   <- readLines(con)
seek(con, 0)
#> [1] 149
y   <- readLines(con)
close(con)
y
#> [1] "\"\",\"a\",\"b\""               "\"1\",-0.989039082667898,\"a\""
#> [3] "\"2\",0.304563032422747,\"b\""  "\"3\",0.876861603714057,\"c\"" 
#> [5] "\"4\",0.430749580251368,\"d\""  "\"5\",-0.464997645114009,\"e\""

Если вы специально хотите прочитать файл как UTF-8, откройте его в режиме rt и укажите кодировку в readLines

df <- data.frame(a = rnorm(5), b = c(letters[1:4], "\u0986"))
write.csv(df, "my.csv", fileEncoding = "UTF-8")

con <- file("my.csv", "rt")
x   <- readLines(con, encoding = "UTF-8")
seek(con, 0)
#> [1] 149
y   <- readLines(con, encoding = "UTF-8")
close(con)
y
#> [1] "\"\",\"a\",\"b\""                   "\"1\",0.250961986479494,\"a\""     
#> [3] "\"2\",-0.874891848118619,\"b\""     "\"3\",-0.394876527760101,\"c\""    
#> [5] "\"4\",0.358779166473852,\"d\""      "\"5\",1.5209073992579,\"<U+0986>\""
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...