如何将C#多维列表放入SSIS对象变量中?

如何将C#多维列表放入SSIS对象变量中?,c#,multidimensional-array,ssis,C#,Multidimensional Array,Ssis,我每周多次收到来自外部供应商的CSV文件,其中包含不同数量的空白单元格、文本限定符,并且经常缺少行分隔符,从而导致我现有的平面文件连接在SSIS包中失败。收到更正的文件需要一天以上的时间,从业务角度来看,这会导致重大问题 我一直在开发一个C#脚本任务,将CSV文件导入多维列表,并成功地将列表内容输出到消息框中。但是,当我试图将列表中的值传递给我的对象变量时,我收到一个错误,说明“在集合中找不到元素” 为了将列表数据传递到对象变量中,我需要做哪些不同的操作?以下是我的现有代码,并附有注释: usi

我每周多次收到来自外部供应商的CSV文件,其中包含不同数量的空白单元格、文本限定符,并且经常缺少行分隔符,从而导致我现有的平面文件连接在SSIS包中失败。收到更正的文件需要一天以上的时间,从业务角度来看,这会导致重大问题

我一直在开发一个C#脚本任务,将CSV文件导入多维列表,并成功地将列表内容输出到消息框中。但是,当我试图将列表中的值传递给我的对象变量时,我收到一个错误,说明“在集合中找不到元素”

为了将列表数据传递到对象变量中,我需要做哪些不同的操作?以下是我的现有代码,并附有注释:

using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;

[Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    {       

        public void Main()
        {
            try
            {
                //string dataRow;

                FileStream fileName = new FileStream(Dts.Variables["ImportFilename"].Value.ToString(), FileMode.Open, FileAccess.Read);

                var column1 = new List<string>();
                var column2 = new List<string>();
                var column3 = new List<string>();
                var column4 = new List<string>();
                var column5 = new List<string>();
                var column6 = new List<string>();
                var column7 = new List<string>();
                var column8 = new List<string>();
                var column9 = new List<string>();
                var column10 = new List<string>();

                using (StreamReader rd = new StreamReader(fileName))
                {
                    while (!rd.EndOfStream)
                    {
                        var splits = rd.ReadLine().Split(',');
                        column1.Add(splits[0]);
                        column2.Add(splits[1]);
                        column3.Add(splits[2]);
                        column4.Add(splits[3]);
                        column5.Add(splits[4]);
                        column6.Add(splits[5]);
                        column7.Add(splits[6]);
                        column8.Add(splits[7]);
                        column9.Add(splits[8]);
                        column10.Add(splits[9]);
                    }

                }
                var mergedColumns = new List<String>(column1.Count +
                                                     column2.Count +
                                                     column3.Count +
                                                     column4.Count +
                                                     column5.Count +
                                                     column6.Count +
                                                     column7.Count +
                                                     column8.Count +
                                                     column9.Count +
                                                     column10.Count);
                mergedColumns.AddRange(column1);
                mergedColumns.AddRange(column2);
                mergedColumns.AddRange(column3);
                mergedColumns.AddRange(column4);
                mergedColumns.AddRange(column5);
                mergedColumns.AddRange(column6);
                mergedColumns.AddRange(column7);
                mergedColumns.AddRange(column8);
                mergedColumns.AddRange(column9);
                mergedColumns.AddRange(column10);

                //THIS IS RETURNING ALL THE VALUES FROM ALL COLUMNS
                string msg = string.Empty;

                foreach (string x in mergedColumns)
                {
                    msg += x.ToString() + "\r\n";
                }

                MessageBox.Show(msg.ToString());

                //RETURNS "The element cannot be found in a collection" ERROR.
                Dts.Variables["importFile"].Value = mergedColumns;

                Dts.TaskResult = (int)ScriptResults.Success;
            }

            catch (Exception ex)
            {
                Dts.Events.FireError(-1, "ErrorMessage", ex.ToString(), "", 0);
                Dts.TaskResult = (int)ScriptResults.Failure;
            }
        }
使用系统;
使用System.Collections.Generic;
使用系统数据;
使用System.IO;
使用Microsoft.SqlServer.Dts.Runtime;
使用System.Windows.Forms;
[Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
公共部分类ScriptMain:Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{       
公共图书馆
{
尝试
{
//字符串数据行;
FileStream fileName=新文件流(Dts.Variables[“ImportFilename”].Value.ToString(),FileMode.Open,FileAccess.Read);
var column1=新列表();
var column2=新列表();
var column3=新列表();
var column4=新列表();
var column5=新列表();
var column6=新列表();
var column7=新列表();
var column8=新列表();
var column9=新列表();
var column10=新列表();
使用(StreamReader rd=新的StreamReader(文件名))
{
而(!rd.EndOfStream)
{
var splits=rd.ReadLine().Split(',');
第1列。添加(拆分[0]);
第2栏添加(拆分[1]);
第3栏添加(拆分[2]);
第4栏添加(拆分[3]);
第5栏添加(拆分[4]);
第6栏添加(拆分[5]);
第7栏添加(拆分[6]);
第8栏添加(拆分[7]);
第9栏添加(拆分[8]);
第10栏添加(拆分[9]);
}
}
var mergedColumns=新列表(column1.Count+
第2栏.计数+
第3栏.计数+
第4栏.计数+
第5栏.计数+
第6栏.计数+
第7栏.计数+
第8栏.计数+
第9栏.计数+
第10栏(计数);
mergedColumns.AddRange(第1列);
mergedColumns.AddRange(第2列);
mergedColumns.AddRange(第3列);
mergedColumns.AddRange(第4列);
mergedColumns.AddRange(第5列);
mergedColumns.AddRange(第6列);
mergedColumns.AddRange(第7列);
mergedColumns.AddRange(第8列);
mergedColumns.AddRange(第9列);
mergedColumns.AddRange(第10列);
//这将返回所有列中的所有值
string msg=string.Empty;
foreach(合并列中的字符串x)
{
msg+=x.ToString()+“\r\n”;
}
Show(msg.ToString());
//返回“集合中找不到元素”错误。
Dts.Variables[“importFile”].Value=mergedColumns;
Dts.TaskResult=(int)ScriptResults.Success;
}
捕获(例外情况除外)
{
Dts.Events.FireError(-1,“ErrorMessage”,例如ToString(),“”,0);
Dts.TaskResult=(int)ScriptResults.Failure;
}
}
更新2016-07-07:

根据我的建议,我对代码进行了以下更新。我想我很接近了,但我无法找出两个问题:

1.)我的td.Columns.Add行中的每一行都会生成错误“Identifier expected”,但我不知道需要做什么来更正它

2.)内部foreach循环声明“……不包含‘键’的定义,并且找不到接受第一个参数类型的扩展方法‘键’。”我不认为我缺少引用,但我不确定是什么错

这是我目前的代码,有什么建议吗

public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
    //THIS WORKS
    public class Schip
    {
        public string UserId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string ResidentState { get; set; }
        public string ResidentStateAbbreviation { get; set; }
        public string NonResidentState { get; set; }
        public string NonResidentStateAbbreviation { get; set; }
        public string IssueDate { get; set; }
        public string ExpirationDate { get; set; }
        public string InternalUserID { get; set; }
    }



    public void Main()
    {
        try
        {
            //THIS WORKS
            FileStream fileName = new FileStream(Dts.Variables["ImportFilename"].Value.ToString(), FileMode.Open, FileAccess.Read);

            List<Schip> adjImport = new List<Schip>();

            StreamReader rd1 = new StreamReader(fileName);

            while (!rd1.EndOfStream)
            {
                var split = rd1.ReadLine().Split(',');
                adjImport.Add(new Schip
                {
                    UserId = split[0],
                    FirstName = split[1],
                    LastName = split[2],
                    ResidentState = split[3],
                    ResidentStateAbbreviation = split[4],
                    NonResidentState = split[5],
                    NonResidentStateAbbreviation = split[6],
                    IssueDate = split[7],
                    ExpirationDate = split[8],
                    InternalUserID = split[9]
                });
            }

            rd1.Dispose();

            //THIS WORKS
            DataTable td = new DataTable("td");
            td.Clear();
            td.Columns.Add("UserId");
            td.Columns.Add("FirstName");
            td.Columns.Add("LastName");
            td.Columns.Add("ResidentState");
            td.Columns.Add("ResidentStateAbbreviation");
            td.Columns.Add("NonResidentState");
            td.Columns.Add("NonResidentStateAbbreviation");
            td.Columns.Add("IssueDate");
            td.Columns.Add("ExpirationDate");
            td.Columns.Add("InternalUserID");


            //THIS GENERATES "Identifier expected" ERRORS ON EACH ROW
            //AND NO DEFINITION FOR "Keys".
            foreach (Schip schip in adjImport)
            {
                DataRow newRow = td.NewRow();
                foreach(string column in schip.Keys)
                {
                    newRow["AdjusterId"] = schip.["AdjusterId"];
                    newRow["FirstName"] = schip.["FirstName"];
                    newRow["LastName"] = schip.["LastName"];
                    newRow["ResidentState"] = schip.["ResidentState"];
                    newRow["ResidentStateAbbreviation"] = schip.["ResidentStateAbbreviation"];
                    newRow["NonResidentState"] = schip.["NonResidentState"];
                    newRow["NonResidentStateAbbreviation"] = schip.["NonResidentStateAbbreviation"];
                    newRow["IssueDate"] = schip.["IssueDate"];
                    newRow["ExpirationDate"] = schip.["ExpirationDate"];
                    newRow["CCMSIAdjusterID"] = schip.["CCMSIAdjusterID"];
                }

                td.Rows.Add(newRow);

                td.AcceptChanges();
            }


            Dts.TaskResult = (int)ScriptResults.Success;
        }

        catch (Exception ex)
        {
            Dts.Events.FireError(-1, "ErrorMessage", ex.ToString(), "", 0);
            Dts.TaskResult = (int)ScriptResults.Failure;
        }
    }

    enum ScriptResults
    {
        Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
        Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
    };

}
public分部类ScriptMain:Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
//这很有效
公营学校
{
公共字符串用户标识{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共字符串剩余状态{get;set;}
公共字符串ResidentState缩写{get;set;}
公共字符串非居民状态{get;set;}
公共字符串非居民状态缩写{get;set;}
公共字符串IssueDate{get;set;}
公共字符串过期日期{get;set;}
公共字符串InternalUserID{get;set;}
}
公共图书馆
{
尝试
{
//这很有效
FileStream fileName=新文件流(Dts.Variables[“ImportFilename”].Value.ToString(),文件