Правильно экранирование специальных символов JSON для использования в файле CSV - PullRequest
0 голосов
/ 05 мая 2018

При извлечении твитов из Твиттера приведен фрагмент полученного необработанного 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 не имеют обратной косой черты вокруг прямой косой черты. (Я не уверен, если это важно, пожалуйста, включите, если это так)

Моя путаница на самом деле заключается в том, как обрабатывать эти экранированные управляющие символы. Запустив запрос SELECT к моей таблице в клиенте MySQL, используя функцию JSON_UNQUOTE MySQL, он удалит символы. \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 Sheets.

Я использую следующий спецификатор после моего запроса:

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

Открытие CSV-файла в Excel отображает следующее: (Вторая строка / запись использует функцию 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"

Вопрос: Как я могу правильно избежать твита здесь, чтобы он мог быть прочитан так, как задумано? Оригинал Tweet Link

Редактировать Советы по использованию ESCAPED BY '"' из @ Michael - sqlbot приблизили меня - но теперь при открытии CSV вторая часть твита (URL) находится в новой ячейке. Я подтвердил, что это происходит как в Excel, так и в Google Sheets:

enter image description here

Рендеринг CSV-изображения (копирование и вставка текста не работает хорошо) enter image description here

1 Ответ

0 голосов
/ 07 мая 2018

После нескольких копаний, некоторых полезных комментариев от @Michael - sqlbot и этого ответа , я получил правильную работу в 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';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...