正确转义用于CSV文件的JSON特殊字符

时间:2018-05-05 07:32:33

标签: mysql json csv json.net escaping

从Twitter检索推文时,这里是收到的原始JSON的片段(通过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客户端中使用MySQL JSON_UNQUOTE function对我的表运行SELECT查询,它将解除对字符的影响。 \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功能时如何显示过多的斜杠。

enter image description here

这是在记事本中打开的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表格中验证了这种情况:

enter image description here

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

1 个答案:

答案 0 :(得分:0)

经过一些挖掘,来自@Michael - sqlbot和this answer的一些有用的评论,我使用以下声明在Google表格和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';