Как записать CSV в R, который правильно считывается таблицами Google

#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() with sep = "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() для размещения окончательных кавычек вокруг столбца, убедившись, что не используются причудливые, направленные кавычки.