2015-12-07 3 views
0

У меня есть проект, в котором я использую скрипты Python для сбора данных из различных API (Google Analytics, Facebook, Instagram и т. Д.). Я пишу собранные данные в плоский файл, а затем использую SSIS для извлечения данных из файла, выполнения некоторых работ ETL, а затем вставки в наш хранилище данных.Вставка строк Unicode в SSIS из плоского файла

Проблема, с которой я столкнулась, имеет значения в Unicode, похоже, что они не могут быть закодированы/декодированы правильно, а другой символ вставляется в базу данных, чем то, что на самом деле. Вот процесс вовлекаются:

закодировать значение данных и запись в файл, используя модуль CSV:

import csv 

with open('{0}{1}.txt'.format(file_path, file_name), 'ab+') as f: 
    writer = csv.writer(f, delimiter='\t') 
    try: 
     writer.writerow(data['name'].encode('utf-8')) 
    except Exception, ex: 
     logging.exception(ex) 

Когда я открываю файл в текстовом редакторе, например Sublime Text, все символы Юникода отображается правильно.

Как только все данные будут записаны в файл, я начну собирать его с помощью SSIS. В SSIS у меня есть задача с плоским файловым источником, которая извлекает данные. Я определил тип данных для столбца «name» в диспетчере подключений как DT_WSTR (Length 4000). Кодовая страница для подключения плоского файла - 65001 (UTF-8).

База данных назначения, которую я пишу, представляет собой базу данных SQL Azure с сортировкой SQL_Latin1_General_CP1_CI_AS. Столбец базы данных назначения определяется как nvarchar(max). Если я попытаюсь записать в обычную базу данных SQL Server с одинаковой сортировкой, результат будет таким же.

Что я здесь делаю неправильно? Есть много символов типа emoji, которые я собираю и не заботясь о том, что важно, это акцентированные и неанглийские символы. Если мне нужно предоставить более подробную информацию или что-то еще, сообщите мне.

+0

может пожалуйста, дайте содержание выборки 'данных [«имя»] ', так как это немного трудно воспроизвести этот вопрос на моей стороне –

+0

Sure вещь, вот пример через различные этапы ETL. В плоском файле это выглядит как Катерина Александровна.Когда я включаю средство просмотра данных после файла Flat File Source и в базе данных, он выглядит как šÐ ° Ñ, ÐμÑ € ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐ. – LifeofaBit

+0

Еще несколько примеров (с разделителями с запятой): Witt ™; Хорхе; Ňess Źéro Ýou – LifeofaBit

ответ

0

Согласно вашему описанию, я рассмотрел документ «Международные соображения для служб интеграции» (https://msdn.microsoft.com/en-us/library/ms141186(v=sql.90).aspx) и сделал пример кода для кодирования/декодирования Python.

Я думаю, что код data['name'] не нужно быть закодированы UTF-8, из-за чтения данных из файла в двоичном режиме по умолчанию с кодировкой ISO-8859-1(Latin-1) в Python.

Как ссылки, вот мой эксперимент код для кодирования/декодирования данных из текстового файла ниже с UTF-8 и ISO-8859-1 в пакете codecs и метод encode('<charset>').

данных в текстовый файл под названием input.txt

Катерина Александровна

import codecs 

iso8859_1c = codecs.lookup('iso-8859-1') 
utf8c = codecs.lookup('utf-8') 

fpw = open('output.txt', 'wb') 

fpr = open('input.txt', 'rb') 
origin = fpr.readline() 
print "Origin>", origin 
print (bytearray(origin),) 
print 
fpw.write('Origin>') 
fpw.write(origin) 
fpw.write('\n') 

fpr.close() 

dec_iso8859_1, n = iso8859_1c.decode(origin) 
print 'ISO-8859-1 decoding>', dec_iso8859_1, n 
print (dec_iso8859_1, n) 
print 'UTF-8 encoding ISO-8859-1>', dec_iso8859_1.encode('utf-8') 
print 'ISO-8859-1 encoding ISO-8859-1>', dec_iso8859_1.encode('iso-8859-1') 
print 
fpw.write('UTF-8 encoding ISO-8859-1: dec_iso8859_1.encode("utf-8")>') 
fpw.write(dec_iso8859_1.encode('utf-8')) 
fpw.write('\n') 

dec_utf8, n = utf8c.decode(origin) 
print 'UTF-8 decoding>', dec_utf8, n 
print (dec_utf8, n) 
print 'UTF-8 encoding UTF-8>', dec_utf8.encode('utf-8') 
# Error for code below: 'latin-1' codec can't encode characters in position 0-7: ordinal not in range(256) 
# print 'ISO-8859-1 encoding UTF-8>', dec_utf8.encode('iso-8859-1') 
print 
fpw.write('UTF-8 encoding UTF-8: dec_utf8.encode("utf-8")>') 
fpw.write(dec_utf8.encode('utf-8')) 
fpw.write('\n') 

enc_utf8_iso8859_1, n = utf8c.encode(dec_iso8859_1) 
print 'UTF-8 encoding ISO-8859-1>', enc_utf8_iso8859_1, n 
print (enc_utf8_iso8859_1, n) 
print 
fpw.write('UTF-8 encoding ISO-8859-1>') 
fpw.write(enc_utf8_iso8859_1) 
fpw.write('\n') 

enc_iso8859_1_iso8859_1, n = iso8859_1c.encode(dec_iso8859_1) 
print 'ISO-8859-1 encoding ISO-8859-1>', enc_iso8859_1_iso8859_1, n 
print (enc_iso8859_1_iso8859_1, n) 
fpw.write('ISO-8859-1 encoding ISO-8859-1>') 
fpw.write(enc_iso8859_1_iso8859_1) 
fpw.write('\n') 

fpw.flush() 
fpw.close() 

Выходной сигнал в консоли:

Origin> Катерина Александровна 
(bytearray(b'\xd0\x9a\xd0\xb0\xd1\x82\xd0\xb5\xd1\x80\xd0\xb8\xd0\xbd\xd0\xb0 \xd0\x90\xd0\xbb\xd0\xb5\xd0\xba\xd1\x81\xd0\xb0\xd0\xbd\xd0\xb4\xd1\x80\xd0\xbe\xd0\xb2\xd0\xbd\xd0\xb0'),) 

ISO-8859-1 decoding> ÐаÑеÑина ÐлекÑандÑовна 43 
(u'\xd0\x9a\xd0\xb0\xd1\x82\xd0\xb5\xd1\x80\xd0\xb8\xd0\xbd\xd0\xb0 \xd0\x90\xd0\xbb\xd0\xb5\xd0\xba\xd1\x81\xd0\xb0\xd0\xbd\xd0\xb4\xd1\x80\xd0\xbe\xd0\xb2\xd0\xbd\xd0\xb0', 43) 
UTF-8 encoding ISO-8859-1> ÐаÑеÑина ÐлекÑандÑовна 
ISO-8859-1 encoding ISO-8859-1> Катерина Александровна 

UTF-8 decoding> Катерина Александровна 43 
(u'\u041a\u0430\u0442\u0435\u0440\u0438\u043d\u0430 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u043e\u0432\u043d\u0430', 43) 
UTF-8 encoding UTF-8> Катерина Александровна 

UTF-8 encoding ISO-8859-1> ÐаÑеÑина ÐлекÑандÑовна 43 
('\xc3\x90\xc2\x9a\xc3\x90\xc2\xb0\xc3\x91\xc2\x82\xc3\x90\xc2\xb5\xc3\x91\xc2\x80\xc3\x90\xc2\xb8\xc3\x90\xc2\xbd\xc3\x90\xc2\xb0 \xc3\x90\xc2\x90\xc3\x90\xc2\xbb\xc3\x90\xc2\xb5\xc3\x90\xc2\xba\xc3\x91\xc2\x81\xc3\x90\xc2\xb0\xc3\x90\xc2\xbd\xc3\x90\xc2\xb4\xc3\x91\xc2\x80\xc3\x90\xc2\xbe\xc3\x90\xc2\xb2\xc3\x90\xc2\xbd\xc3\x90\xc2\xb0', 43) 

ISO-8859-1 encoding ISO-8859-1> Катерина Александровна 43 
('\xd0\x9a\xd0\xb0\xd1\x82\xd0\xb5\xd1\x80\xd0\xb8\xd0\xbd\xd0\xb0 \xd0\x90\xd0\xbb\xd0\xb5\xd0\xba\xd1\x81\xd0\xb0\xd0\xbd\xd0\xb4\xd1\x80\xd0\xbe\xd0\xb2\xd0\xbd\xd0\xb0', 43) 

И выход в файл под названием output.txt:

Origin>Катерина Александровна 
UTF-8 encoding ISO-8859-1: dec_iso8859_1.encode("utf-8")>ÐаÑеÑина ÐлекÑандÑовна 
UTF-8 encoding UTF-8: dec_utf8.encode("utf-8")>Катерина Александровна 
UTF-8 encoding ISO-8859-1>ÐаÑеÑина ÐлекÑандÑовна 
ISO-8859-1 encoding ISO-8859-1>Катерина Александровна 
Смежные вопросы