Чтение файла csv со встроенными кавычками в R

Мне нужно работать с файлом .csv, который выглядит следующим образом:

"IDEA ID,""IDEA TITLE"",""VOTE VALUE"""
"56144,""Net Present Value PLUS (NPV+)"",1"
"56144,""Net Present Value PLUS (NPV+)"",1"

Если я использую read.csv, я получаю фрейм данных с одной переменной. Мне нужен фрейм данных с тремя столбцами, где столбцы разделены запятыми. Как я могу обрабатывать кавычки в начале строки и в конце строки?


person user3819143    schedule 09.07.2014    source источник
comment
См. quote вариант read.csv.   -  person    schedule 09.07.2014
comment
Вероятно, это ответ, который вам нужен: stackoverflow.com/a/17415028/1036500   -  person Ben    schedule 09.07.2014
comment
возможный дубликат предупреждения read.csv ' EOF внутри строки в кавычках предотвращает полное чтение файла   -  person Nikolay Nenov    schedule 09.07.2014
comment
Я не думаю, что эти связанные вопросы на самом деле ответят на вопрос ОП...   -  person Ben Bolker    schedule 09.07.2014
comment
Угу. Как кому-то удалось так сильно испортить CSV-файл? У вас есть идеи, почему они отформатировали его таким образом?   -  person MrFlick    schedule 09.07.2014


Ответы (2)


Я не думаю, что будет простой способ сделать это, не удаляя сначала начальные и конечные кавычки. Если в вашей системе sed (Unix [Linux/MacOS] или Windows+Cygwin?), то

read.csv(pipe("sed -e 's/^\"//' -e 's/\"$//' qtest.csv"))

должно сработать. В противном случае

read.csv(text=gsub("(^\"|\"$)","",readLines("qtest.csv")))

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

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

person Ben Bolker    schedule 09.07.2014
comment
Не могли бы вы также порекомендовать изменить двойную кавычку в середине строки на одну двойную кавычку? - person MrFlick; 09.07.2014
comment
не уверен, что вы имеете в виду здесь. Середина какой строки? Регулярное выражение во втором примере предназначено для обозначения начала строки, за которой следует двойная кавычка ИЛИ двойная кавычка, за которой следует конец строки... - person Ben Bolker; 09.07.2014
comment
Верно. Вы имеете дело с теми, что в конце строк (если я правильно понял). Также есть ""IDEA TITLE"". Эти цитаты ничего не испортят? - person MrFlick; 09.07.2014
comment
@Fo.: Я так не думал, но эти ответы здесь работают (с небольшой адаптацией). Тем не менее, я все еще думаю, что мой ответ на основе sed может быть быстрее, где доступен sed... - person Ben Bolker; 18.07.2014
comment
@Fo., ты повторяешься? - person Ben Bolker; 18.07.2014

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

"1,""A mostly harmless string"",11"
"2,""Another mostly harmless string"",12"
"3,""These, commas, cause, trouble"",13"

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

data.text <- readLines("fullofquotes.csv")  # Reads data from file into a character vector.
data.text <- gsub("^\"|\"$", "", data.text) # Removes initial/terminal quotes.
data.text <- gsub("\"\"", "\"", data.text)  # Replaces "" by ".
data <- read.csv(text=data.text, header=FALSE)

Или, конечно, все в одну строку

data <- read.csv(text=gsub("\"\"", "\"", gsub("^\"|\"$", "", readLines("fullofquotes.csv", header=FALSE))))
person Honza Zouhar    schedule 09.10.2015