【问题标题】:Using SSIS to separate long text使用 SSIS 分隔长文本
【发布时间】:2016-09-22 03:04:09
【问题描述】:

输入示例:

第1栏第2栏第3栏第4栏第5栏

EE12 2014-05-17 22:05:36.260 2 3 12345678901234567890123456789123456789457908

输出应该是什么样子:

第1栏第2栏第3栏第4栏第5栏

EE12 2014-05-17 22:05:36.260 2 3 1234

EE12 2014-05-17 22:05:36.260 2 3 5678

对于长文本的第 5 列,我需要将长文本分成 4 个字符。最长数据长度为 10800。对于第 1 到第 4 列将保持不变。每 4 个字符,将记录一个新行。

我正在使用 SSIS 脚本组件来执行此操作。我需要 C# 编码方面的帮助来分离长文本并写入数据库。

我用来将字符分成4个字符的方法

public class ScriptMain : UserComponent
{
    public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
        //Regax method to seperated the text into 4 characters each
        var input = Row.value.ToString();       
        var regex = new Regex(@".{4}");
        string result = regex.Replace(input, "$&" + Environment.NewLine);
    }

}

【问题讨论】:

  • @MJH 我尝试使用派生列和条件拆分。但是,它不起作用。
  • 请贴出您尝试过的代码,并说明 如何 不起作用。否则我怀疑你会收到很多有用的回复。
  • 使用异步脚本组件,您将能够读取每一行并根据需要操作输出。 Link to reference
  • 一个基本问题....您尝试处理的数据是在数据库中还是在 C# 中的 DataTable 中?如果它在数据库中,您只能获取 4 个字符并对其进行处理。但如果它是在 C# 中,则有很多可用的选项。请说明您需要什么。

标签: c# visual-studio ssis


【解决方案1】:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Data;
using System.Configuration;
namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            //prepare for  splitting the long text and writing into database
            string originalData = "EE12 2014-05-17 22:05:36.260 2 3 1234567890123456789012345678912345678945790842";
            string [] constantField = originalData.Split(' ');
            //previous line results as follow:
            //[0] EE12
            //[1] 2014-05-17
            //[2] 22:05:36.260
            //[3] 2
            //[4] 3
            //[5] 1234567890123456789012345678912345678945790842
            StringBuilder splitingCharacters = new StringBuilder(constantField[5]);
            splitingCharacters.Append(constantField[5]);
           // splitting and writing
           SqlParameter[] sqlParams = new SqlParameter[4];
            sqlParams[0] = new SqlParameter("@column1",SqlDbType.Char,constantField[0].Length);
            sqlParams[1] = new SqlParameter("@column2", SqlDbType.Char, constantField[1].Length + constantField[2].Length+1);
            sqlParams[2] = new SqlParameter("@column3", SqlDbType.Char, constantField[3].Length);
            sqlParams[3] = new SqlParameter("@column4", SqlDbType.Char, constantField[4].Length);

            sqlParams[0].Value = constantField[0];
            sqlParams[1].Value = string.Format("{0} {1}", constantField[1], constantField[2]);
            sqlParams[2].Value = constantField[3];
            sqlParams[3].Value = constantField[4];

            while (splitingCharacters.Length > 0)
            {
                using (SqlConnection sqlConn = new SqlConnection("your connection sql "))
                {
                    SqlCommand sqlComm = new SqlCommand("insert into table1 (column1,column2,column3,column4,column5) values (@column1,@column2,@column3,@column4,@column5)", sqlConn);
                    sqlComm.CommandType = CommandType.Text;
                    sqlComm.Parameters.AddRange(sqlParams);
                    //Spliting the text from left to right.
                    sqlComm.Parameters.Add(new SqlParameter("@column5",SqlDbType.Char,4).Value = splitingCharacters.ToString(0, 4));
                    splitingCharacters.Remove(0, 4);
                    sqlConn.Open();
                    int result = sqlComm.ExecuteNonQuery();
                }
            }
        }
    }
}

【讨论】:

    【解决方案2】:

    设置异步脚本组件,你应该可以编写类似下面示例的内容。下面的代码我没有测试,如果有任何问题请评论。

    将此作为入门指南。

    public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
        var column1Value = Row.Column1;
        var column2Value = Row.Column2;
        var column3Value = Row.Column3;
        var column4Value = Row.Column4;
        var column5Value = Row.Column5;
    
        while(column5Value.Length > 0)
        {
            var rowData = "";
            if (column5Value.Length > 4)
            {
                rowData = column5Value.Substring(0, 4);
                column5Value = column5Value.Substring(4);
            }
            else
            {
                rowData = column5Value;
                column5Value = "";
            }
    
            Output0Buffer.AddRow();
            Output0Buffer.Column1 = column1Value;
            Output0Buffer.Column2 = column2Value;
            Output0Buffer.Column3 = column3Value;
            Output0Buffer.Column4 = column4Value;
            Output0Buffer.Column5 = rowData;            
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-25
      • 1970-01-01
      • 2016-05-04
      • 1970-01-01
      相关资源
      最近更新 更多