首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在R中编写可被Google电子表格正确读取的CSV

如何在R中编写可被Google电子表格正确读取的CSV
EN

Stack Overflow用户
提问于 2021-10-26 17:43:38
回答 1查看 53关注 0票数 1

问题

我正在尝试将数据帧写入CSV文件,该文件将被Google电子表格正确读取,但是我遇到了一个特定列格式的错误。

有一个名为“details”的列,其值类似于此{\"campaign_id\":1,\"line_item_id\":1234}。R可以从谷歌电子表格提供的原始数据帧中正确地读取该列格式,但是当写入CSV时,该列沿着,被分成两列,从而覆盖下一列的值(默认情况下为空)。

数据

R中的数据帧如下所示:

代码语言:javascript
复制
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)

代码语言:javascript
复制
data %>%
  mutate(Details = dQuote(Details,q = )) %>%
  write.csv("test.csv", fileEncoding = "UTF-8",na = "",row.names = FALSE,quote = FALSE)

但这似乎不起作用,省略dQuote也不起作用。

我的输出csv是这样的:

test.csv generated by above code

更多细节

这里讨论的数据是由管理YouTube广告活动的谷歌平台DV360生成的SDF。在我的过程中,我从DV360下载了一个SDF文件,修改了R中的一些值,然后上传回来。然而,由于所描述的问题,重新上传目前不起作用。我已经对它进行了测试,以确认上面描述的列问题是否导致了问题,如果手动更正,则上传工作正常。

预期输出

我已经将预期输出和正在获得的输出相加。

我目前所拥有的:

代码语言:javascript
复制
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,

我需要的是:

代码语言:javascript
复制
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中手动修复问题,然后下载文件时,我得到的结果是:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2021-10-26 19:13:26

在从@Greg和@MrFlick那里得到有价值的输入后,我终于能够解决这个问题了。

为了使谷歌生态系统(电子表格和Dv360)能够正确地读取列,它需要具有以下格式:

代码语言:javascript
复制
"{""campaign_id"":1,""line_item_id"":1234}"

使用dQuote()会在列两边加上必要的引号,但由于我的系统设置,提供的引号类型不正确。所以我们需要推迟useFancyQuotes

此外,campaign_idline_item_id周围已经出现的引号需要双引号。

也许有一种更快的方法,但下面的代码可以工作:

代码语言:javascript
复制
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()将最后一个引号放在列两边,确保不使用花哨的定向引号。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69727688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档