#r #csv #google-sheets
Вопрос:
Проблема
Я пытаюсь записать фрейм данных в CSV-файл, который будет правильно считан таблицами Google, однако я сталкиваюсь с ошибкой с определенным форматом столбца.
Существует один столбец под названием «детали», который имеет значения, которые выглядят следующим {"campaign_id":1,"line_item_id":1234}
образом . Этот формат столбца правильно считывается R из исходного фрейма данных, предоставленного из таблиц Google, но при записи в CSV столбец разделяется вдоль ,
на два столбца, перезаписывая значения следующего столбца (который по умолчанию пуст).
Данные
Фрейм данных в R выглядит следующим образом:
data <- structure(
list(
`Line Item Id` = c(1234, 4567),
Details = c(
"{"campaign_id":1,"line_item_id":1234}",
"{"campaign_id":1,"line_item_id":4567}"
),
`Bid Strategy Type` = c("",""),
`TrueView Video Ad Formats` = c("In-stream / Video Discovery",
"In-stream / Video Discovery"),
`TrueView Bid Strategy Type` = c("Manual CPV",
"Manual CPV")
),
row.names = 1:2,
class = "data.frame"
)
Текущий подход
Я попытался написать соответствующую колонку в цитате:
библиотека (tidyverse)
data %>%
mutate(Details = dQuote(Details,q = )) %>%
write.csv("test.csv", fileEncoding = "UTF-8",na = "",row.names = FALSE,quote = FALSE)
Но это, похоже, не работает, и при этом не пропускается dQuote
.
Мой выходной CSV-файл выглядит следующим образом:
test.csv, созданный приведенным выше кодом
Подробнее
Обрабатываемые здесь данные представляют собой SDF, созданный DV360, платформой Google для управления рекламными кампаниями на YouTube. В моем процессе я загружаю SDF с DV360, изменяю некоторые значения в R и загружаю его обратно. Однако повторная загрузка в данный момент не работает из-за описанной проблемы. Я протестировал его, чтобы подтвердить, что проблема со столбцом, описанная выше, вызывает проблему, и если исправленная вручную загрузка работает.
Ожидаемый результат
Я добавил ожидаемый результат и результат, который я получаю.
Что у меня есть на данный момент:
Line Item Id,Details,TrueView Video Ad Formats,TrueView Bid Strategy Type
14596716402,“{"campaign_id":283,"line_item_id":99588}”,In-stream / Video Discovery,
14596725552,“{"campaign_id":283,"line_item_id":99585}”,In-stream / Video Discovery,
Что мне нужно:
Line Item Id,Details,TrueView Video Ad Formats,TrueView Bid Strategy Type
1234,"{""campaign_id"":1,""line_item_id"":1234}",,In-stream / Video Discovery
4567,"{""campaign_id"":1,""line_item_id"":4567}",,In-stream / Video Discovery
И довольно интересно, что я получаю, когда я вручную решаю проблему в googlesheets, а затем загружаю файл:
Line Item Id,Details,TrueView Video Ad Formats,TrueView Bid Strategy Type
1234,"""{""""campaign_id"""":1,""""line_item_id"""":1234}""",,In-stream / Video Discovery
4567,"""{""""campaign_id"""":1,""""line_item_id"""":4567}""",,In-stream / Video Discovery
Комментарии:
1. Рассматривали ли вы возможность простого использования
googlesheets4
googledrive
пакетов and, которые интегрированы вtidyverse
?2. Итак, вы пытались
write.csv(data, "test.csv", row.names=FALSE)
, и это не сработало? Как именно вы читаете его с помощью Google Sheets? Если я беру вывод из команды, которую я написал, и перетаскиваю его на Google Диск, он правильно открывается в таблицах.3. @Грег, нет, потому что я не знал, что такое существует. Если это сработает, я буду безмерно благодарен и унижен^^
4. @Fnguyen Рад помочь! Смотрите эту ссылку для получения списка пакетов, интегрированных в или совместимых с
tidyverse
.5. @Fnguyen Жаль это слышать. Может быть, попробовать настроить
qmethod
параметр дляwrite.csv()
? Кроме того, разрешено ли вам использовать файл с разделителями табуляции.tsv
вместо a.csv
? если да, тоwrite.table()
withsep = "t"
должен сделать свое дело. Я всегда предпочитал TSV, потому что (по моему опыту) табуляции встречаются в наборах данных реже, чем запятые…
Ответ №1:
После получения ценного вклада от @Greg и @MrFlick я, наконец, смог решить эту проблему.
Для экосистемы Google (электронные таблицы и Dv360) для правильного чтения столбца он должен иметь этот формат:
"{""campaign_id"":1,""line_item_id"":1234}"
Использование dQuote()
приведет к размещению необходимых кавычек вокруг столбца, но из-за моих системных настроек был указан неправильный тип кавычек. Итак, нам нужно отложить useFancyQuotes
.
Кроме того, уже встречающиеся кавычки вокруг campaign_id
и line_item_id
должны быть заключены в двойные кавычки.
Возможно, есть более быстрый способ, но следующий код будет работать:
library(dplyr) # only needed for pipe, not part of solution
options(useFancyQuotes = FALSE)
data %>%
mutate(Details = dQuote(gsub('"','""',Details))) %>%
write.csv("test3.csv", fileEncoding = "UTF-8",na = "",row.names = FALSE,quote = FALSE)
Итак, нам нужно сначала преобразовать все кавычки в двойные кавычки, что я и сделал, gsub()
а затем использовать dQuote()
для размещения окончательных кавычек вокруг столбца, убедившись, что не используются причудливые, направленные кавычки.