【问题标题】:Properly escaping JSON special characters for use in a CSV file正确转义 JSON 特殊字符以在 CSV 文件中使用
【发布时间】:2018-10-15 15:35:20
【问题描述】:

从 Twitter 检索推文时,这里是接收到的原始 JSON 的 sn-p(通过 Fiddler 捕获:

[{"text":"\"California GOP Files FEC Complaint Over Obama Visit to Dying Grandmother\"\r\nhttp:\/\/url.com\/6jd5j5"}]

在对它进行一些操作后,包括反序列化,然后重新序列化它(通过JSON.NET),它最终在数据库中是这样的:

{"text": "\"California GOP Files FEC Complaint Over Obama Visit to Dying Grandmother\"\r\nhttp://url.com/6jd5j5"}

唯一的区别是,URL 在正斜杠周围没有反斜杠转义。 (我不确定这是否有什么大不了的,如果是的话,请插话)

我的困惑实际上是如何处理这些转义的控制字符。在 MySQL 客户端中对我的表运行 SELECT 查询,使用 MySQL 的JSON_UNQUOTE function,它将取消转义字符。 \r\n 被正确转义,但它保留了有趣的文本周围的双引号...

+----------+-------------------------------------------------------------------------------------------------------+
| user_id  | JSON_UNQUOTE(JSON_EXTRACT(tw.tweet_json, '$.text'))                                                   |
+----------+-------------------------------------------------------------------------------------------------------+
| 12844052 | "California GOP Files FEC Complaint Over Obama Visit to Dying Grandmother"
http://url.com/6jd5j5 |
+----------+-------------------------------------------------------------------------------------------------------+

这是我不使用 JSON_UNQUOTE unescape 函数时的样子:

+-------------------------------------------------------------------------------------------------------------+
| JSON_EXTRACT(tw.tweet_json, '$.text')                                                                       |
+-------------------------------------------------------------------------------------------------------------+
| "\"California GOP Files FEC Complaint Over Obama Visit to Dying Grandmother\"\r\nhttp://url.com/6jd5j5" |
+-------------------------------------------------------------------------------------------------------------+

我需要将这些推文导出为 CSV 文件,供 Excel 或 Google 表格使用。

我在查询后使用以下说明符:

INTO OUTFILE 'C:/ProgramData/MySQL/MySQL Server 5.7/Uploads/so.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';

使用 Excel 打开 CSV 文件会显示以下内容: (第二行/条目使用 JSON_UNESCAPE 功能)

注意第二个条目在使用 JSON_UNESCAPE 功能时如何显示过多的斜线。

这是在记事本中打开的 CSV 文件:

  "\"\\\"California GOP Files FEC Complaint Over Obama Visit to Dying Grandmother\\\"\\r\\nhttp://url.com/6jd5j5\""
"\"California GOP Files FEC Complaint Over Obama Visit to Dying Grandmother\"
\
http://url.com/6jd5j5"

问题:我怎样才能在此处正确地转义推文,以便可以按原意阅读? Original Tweet Link

编辑 来自 @Michael - sqlbot 的使用 ESCAPED BY '"' 的建议让我更接近 - 但现在打开 CSV 时,推文的第二部分(URL)位于一个新单元格中。我已验证 Excel 和 Google 表格都会发生这种情况:

渲染的 CSV 图像(复制和粘贴文本效果不佳)

【问题讨论】:

  • 你应该可以使用JSON_UNQUOTE() ... ENCLOSED BY '"' ESCAPED BY '"' ...
  • ...因为 CSV 标准,例如,通过将 " 加倍然后用另一组 qoutes 包装(封闭)整个字符串并添加转义指令来转义应该生成有效的 CSV。试试这个?
  • @Michael-sqlbot 在这里感谢您的建议 - 它让我更接近了。当您有时间时,请在答案中查看我的编辑。
  • 您的 CSV 结果不太正确。第一行很好,最后一行也很好,但是第二行根本不应该在那里,也不清楚是什么触发了……但我最好的猜测是有嵌入式 CR \r和 LF \n,其中一个需要被淘汰。问题的根源在于SELECT ... INTO OUTFILE 非常原始,而 CSV 也非常原始。 REPLACE(JSON_UNQUOTE(...),'\r','') 可能是诀窍。或者把\n放在这里。

标签: mysql json csv json.net escaping


【解决方案1】:

经过一番挖掘,来自@Michael - sqlbot 和this answer 的一些有用的cmets,我通过以下语句使其在Google Sheets 和Excel 中正常工作:

    SELECT REPLACE(JSON_UNQUOTE(JSON_EXTRACT({JSON_COL}, {JSON_PROP_TO_RETRIEVE})), '\r\n', '\n')
      ...
    INTO OUTFILE 'C:/ProgramData/MySQL/MySQL Server 5.7/Uploads/{FILE_NAME}.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '"' LINES TERMINATED BY '\r\n';

【讨论】:

    猜你喜欢
    • 2014-05-11
    • 2017-01-31
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    相关资源
    最近更新 更多