2017-11-30 3 views
0

Wir erhalten eine Umfrage Web-Hook-Daten in Bigquery. Der Kommentar in der lokalen Sprache wird als Unicode und Sonderzeichen erfasst. Ich schreibe bereits eine Funktion, um den Unicode in eine lokale Sprache zu konvertieren, und regex, um Sonderzeichen zu vermeiden.ReGex für vermeiden Emoji - Unicode/BigQuery

#standardSQL 
CREATE TEMP FUNCTION DecodeUnicode(s STRING) AS (
(SELECT CODE_POINTS_TO_STRING(ARRAY_AGG(CAST(CONCAT('0x', x) AS INT64))) 
FROM UNNEST(SPLIT(s, '\\u')) AS x 
WHERE x != '' 
) 
); 
WITH NPSDashboard_Webhook_Data1_copy AS (
SELECT 
TRIM(Comment) Comment 
FROM 
`radiant-micron-790.Sharmila_Testing.NPSDashboard_Webhook_Data1_copy` 
) 
, 
uchars AS (
SELECT DISTINCT 
c, 
DecodeUnicode(c) uchar 
FROM NPSDashboard_Webhook_Data1_copy, 
UNNEST(REGEXP_EXTRACT_ALL(Comment, r'(\\u[abcdef0-9]{4})')) c 
) 

SELECT 
Comment, 
STRING_AGG(IFNULL(uchar, x), '' ORDER BY pos) Decoded 
FROM (
SELECT 
Comment, 
pos, 
SUBSTR(Comment, 
SUM(CASE char WHEN '' THEN 1 ELSE 6 END) 
    OVER(PARTITION BY Comment ORDER BY pos) - CASE char WHEN '' THEN 0 ELSE 5 
    END, 
    CASE char WHEN '' THEN 1 ELSE 6 END) x, 
    uchar 
    FROM NPSDashboard_Webhook_Data1_copy, 
    UNNEST(REGEXP_EXTRACT_ALL(Comment, r'(\\u[abcdef0-9]{4})|.')) char WITH OFFSET AS pos 
    LEFT JOIN uchars u ON u.c = char 
) 
    GROUP BY Comment 

seine Rückkehr Fehler: -

  • Abfrage fehlgeschlagen

  • Fehler: Ungültige Codepoint 55357

ich fand, dass "\ ud83c \ udf38" seine Rückkehr Fehler Das ist "Cherry Blossom" in Emoji Return-Fehler. Wie Regex oder Konverter zu tun, um dieses Problem zu lösen?

Antwort

0

Ich glaube nicht, dass Sie dies in reinem SQL tun können.

Ich empfehle, die UTF-16 Emojis in HTML-Entities (hex) zu konvertieren, um sie in der DB zu speichern. Wahrscheinlich müssen Sie eine Programmiersprache nutzen, dies zu tun:

es so Versuchen in .NET

using System; 
using System.Text; 
using System.Globalization; 
using System.Net; 

public class Program 
{ 
    public static void Main() 
    { 

     Console.WriteLine(WebUtility.HtmlEncode("\uD83D\uDE02")); 
    } 
} 

Oder können Sie emoji4j Bibliothek für diese in Java (ref) verwenden:

String line = "Hi , i am fine \uD83D\uDE02 \uD83D\uDE02, how r u ?"; 
EmojiUtils.hexHtmlify(line); //Hi , i am fine 😂 😂, how r u ?