r - 如何在 R 中编写由 Google 电子表格正确读取的 CSV
问题描述
问题
我正在尝试将数据框写入 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 是这样的:
更多细节
这里讨论的数据是由谷歌平台 DV360 生成的 SDF,用于管理 YouTube 广告活动。在我的过程中,我从 DV360 下载了一个 SDF,更改了 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
解决方案
从@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()
在列周围放置最终引号,确保不要使用花哨的定向引号。
推荐阅读
- c++ - 使用双指针的反向链表
- augmented-reality - 1.16.0 的 Sceneform 依赖项(不兼容 AndroidX)
- python - 熊猫 | 如何获取包含时间戳的两列之间的时间差(以秒为单位)
- python - “import Fuzzywuzzy”会导致错误,而“fromfuzzywuzzy import fuzz”不会
- linux - 构建 eudev 3.2.7 时缺少标题
- tensorflow - 数据增强层的行为是什么?
- c# - 处理HttpclientHandler的正确方法
- python-3.x - Django Form - 从数据库中获取最后一条记录值作为表单字段的动态默认值或初始值
- python - 在 Python 中使用 Keras 构建多对多 LSTM 模型的正确方法是什么?
- amazon-web-services - 在端口 8787 上运行 RStudio 的 EC2 服务器实例超时