прочитать файл csv с кавычками и регулярным выражением R

ne,class,regex,match,event,msg
BOU2-P-2,"tengigabitethernet","tengigabitethernet(?'connector'\d{1,2}\/\d{1,2})","4/2","lineproto-5-updown","%lineproto-5-updown: line protocol on interface tengigabitethernet4/2, changed state to down"

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

Меня интересует класс столбцов и сообщение, поэтому этого вывода будет достаточно:

class              msg
tengigabitethernet %lineproto-5-updown: line protocol on interface tengigabitethernet4/2, changed state to down

но я также могу импортировать все столбцы и отменить выбор тех, которые мне не нужны, позже, не беспокойтесь.

Данные поступают в файл .csv, который мне дали. Если я открою этот файл в Excel, все столбцы будут в одном. Я работаю во Франции, но я не знаю, в какой локали или кодировке был создан файл (кстати, я не француз, поэтому я не очень знаком с ними).

я пробовал с

df <- read.csv("file.csv", stringsAsFactors = FALSE)

и в кадре данных имена столбцов красиво разделены, но все значения находятся в первом

затем с

    library(readr)
df <- read_delim('file.csv', 
           delim = ",", 
           quote = "",
           escape_double = FALSE, 
           escape_backslash = TRUE)

но таким образом столбец регулярного выражения разбивается на два столбца, поэтому я полностью теряю переменную msg.

С

    library(data.table)
df <- fread("file.csv")

Я получаю переменную msg, но пустую, так как переменная ne содержит и ne, и класс, разделенные запятой. это лучший результат на данный момент, так как я могу манипулировать им, чтобы получить желаемый результат.

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

и read.delim, и fread дают предупреждающие сообщения, я могу включить их, если они могут быть полезны.

Обновить:

с использованием

library(data.table)
df <- fread("file.csv", quote = "")

дает мне более легкий вывод для управления, он разбивает столбец regex и msg на две части, но ne и класс различны


person goingdeep    schedule 27.01.2021    source источник


Ответы (1)


Я попробовал с вводом, который вы предоставили read.csv, и у меня не было проблем; при подмножестве каждый столбец доступен. Что касается других ваших вариантов, вы неправильно понимаете вариант цитаты, он должен быть "\""; символ двойной кавычки необходимо экранировать, т.е.: df <- fread("file.csv", quote = "\""). При использовании read.csv в вашем примере я определенно получаю фрейм данных с 1 строкой и 6 столбцами:

df <- read.csv("file.csv")
nrow(df)
# Output result for number of rows
# > 1
ncol(df)
# Output result for number of columns
# > 6

tmp$ne
# > "BOU2-P-2"
tmp$class
# > "tengigabitethernet"
tmp$regex
# > "tengigabitethernet(?'connector'\\d{1,2}\\/\\d{1,2})"
tmp$match
# > "4/2"
tmp$event
# > "lineproto-5-updown"
tmp$msg
# > "%lineproto-5-updown: line protocol on interface tengigabitethernet4/2, changed state to down"
person rps1227    schedule 27.01.2021
comment
спасибо за ответ, я думаю, что это вопрос кодировки и локали, тогда, как и в случае с read.csv, я не получаю такой же вывод, как вы. экранирование кавычек является опцией по умолчанию в fread, и это дало немного более сложный вывод для манипулирования - person goingdeep; 28.01.2021
comment
Какая у вас операционная система? Windows печально известна проблемами кодирования. В противном случае файл может быть не в кодировке UTF-8; если вы знаете, какая кодировка используется (и это не UTF-8 или Latin1), вы можете указать ее в read.csv с опцией fileEncoding. - person rps1227; 28.01.2021
comment
Я работаю в Windows, в любом случае я изменил файл в Excel, и теперь read.csv2 работает как часы, спасибо за ваше время. - person goingdeep; 28.01.2021