Julie Elizabeth Sam Ответов: 1

Как работать со специальными символами при использовании textfieldparser в задаче SSIS script


У меня есть пакет SSIS для работы с несколькими файлами, несколькими типами разделителей, разными именами столбцов, нет разных столбцов и т. д.. Теперь у меня есть проблема при загрузке специальных символов в БД из csv. В моей целевой таблице есть только поля nvarchar. Если я включаю N" до данных, то он показывает несколько иной характер, чем исходные данные. В противном случае, это видно ?. Поскольку я ожидаю файлы с разными разделителями, иногда текстовый квалификатор, иногда нет, выпуск кодовой страницы и т. д., Используя задачу скрипта для загрузки данных.

Исходные данные:
ними - ними - ними

Когда N":
ними � ними � ними

При использовании кодировки:

именем именем именем

Что я уже пробовал:

public void Main()
{
    // TODO: Add your code here

    string delimiter = Dts.Variables["User::var_Delimiter"].Value.ToString();
    string TableName = Dts.Variables["$Package::Param_Tbl_Name"].Value.ToString();
    string filePath = Dts.Variables["User::var_File_Path"].Value.ToString();
    string fileName = Dts.Variables["User::var_File_Name"].Value.ToString();
    string srcfolder = Dts.Variables["$Package::Param_Src_Folder"].Value.ToString();
    string tbl = TableName.Replace("[", "");
    tbl = tbl.Replace("]", "");
    tbl = tbl.Replace("dbo.", "");
    string fieldname_file = "";
    string fieldname_tbl = "";
    string fieldnames = "";
    string query = "";
    int counter = 0;
    string line = "";
    int maxcol = 0;
    int maxcol1 = 0;
    
    SqlConnection myADONETConnection = new SqlConnection();
    myADONETConnection = (SqlConnection)Dts.Connections["ADOAUDIT"].AcquireConnection(Dts.Transaction) as SqlConnection);
    SqlCommand sqlCommand = null;

    using (TextFieldParser parser = new TextFieldParser(filePath, System.Text.Encoding.GetEncoding("iso-8859-8"));))
    {
        parser.TextFieldType = FieldType.Delimited;
        parser.SetDelimiters(delimiter);
        parser.HasFieldsEnclosedInQuotes = true;
                    
        while (!parser.EndOfData)
        {
            string[] fieldrow = parser.ReadFields();

            if (counter == 0)
            {
                for (int i = 0; i < fieldrow.Length; i++)
                {
                    fieldname_file = fieldrow[i];
                    if (!String.IsNullOrEmpty(fieldname_file))
                    {
                        fieldname_file = fieldname_file.Substring(0, 6);
                        query = "select name from sys.columns " +
                                "where object_id = (select object_id from sys.objects where name = '" + tbl + "')" +
                                "and name like '%" + fieldname_file + "%'";
                        sqlCommand = new SqlCommand(query, myADONETConnection);
                                    fieldname_tbl = (string)sqlCommand.ExecuteScalar();

                        if (!String.IsNullOrEmpty(fieldname_tbl))
                        {
                            fieldnames = fieldnames + "[" + fieldname_tbl.Replace("'", "''") + "],";
                            maxcol = i;
                        }
                    }
                }

                query = "select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS" +
                        " where table_name ='" + tbl + "' " +
                        "and column_name like '%file%name%'";
                        sqlCommand = new SqlCommand(query, myADONETConnection);
                        fieldname_tbl = (string)sqlCommand.ExecuteScalar();

                //fieldnames = fieldnames + "[FileName]";
                fieldnames = fieldnames + "["+fieldname_tbl+"]";
            }
            else
            {
                query = "";
                line = "";
                if (fieldrow.Length == maxcol + 1)
                {
                    for (int j = 0; j < fieldrow.Length; j++)
                    {
                        line = line + "N'" + fieldrow[j].Replace("'", "''") + "',";
                    }
                }
                else
                {
                    for (int j = 0; j < fieldrow.Length - (fieldrow.Length - (maxcol + 1)); j++)
                    {
                        line = line + "N'" + fieldrow[j].Replace("'", "''") + "',";
                        maxcol1 = j;
                    }
                }

                line = line + "'" + fileName + "'";
                query = "insert into " + tbl + "(" + fieldnames + ") values(" + line + ")";
                sqlCommand = new SqlCommand(query, myADONETConnection);
                sqlCommand.ExecuteNonQuery();
            }

            counter++;

        }
    }

#realJSOP

Символ � существует потому, что символ, который он пытается представить, не может быть декодирован. Можете ли вы показать нам часть файла, которая генерирует этот символ?

Richard Deeming

Кроме того, проверьте кодировку исходного файла - вы абсолютно уверены, что это ISO-8859-8?

1 Ответов

Рейтинг:
1

#realJSOP

Не используйте указанный кодировщик. Windows использует UTF16 по умолчанию, поэтому вам не нужно указывать кодер, если только в файле нет чего-то странного.

Просто попробуйте и посмотрите, имеет ли это значение.