Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在SSIS中处理具有多种格式和不同记录集的平面文件_C#_Ssis - Fatal编程技术网

C# 在SSIS中处理具有多种格式和不同记录集的平面文件

C# 在SSIS中处理具有多种格式和不同记录集的平面文件,c#,ssis,C#,Ssis,我正在尝试使用SSI处理一个被分割的平面文件。该文件有两种不同类型的记录。每个记录集都有不同的标题行和尾行。他们需要去两张不同的桌子 拖车行具有每个记录集的行数,而标题行包含记录的列名。所以本质上它就像两种类型的文件,但在一个文件中 我尝试过几种解决方案,包括使用条件拆分,但我一直未能实现这一点。我知道您可以使用脚本组件和C#来实现这一点,但我还没有实现这一点。我附加了一个图像来显示文件格式 这就是我迄今为止所尝试的 我将平面文件连接编辑为ragged right,以便输出在一列中 然后我创建了

我正在尝试使用SSI处理一个被分割的平面文件。该文件有两种不同类型的记录。每个记录集都有不同的标题行和尾行。他们需要去两张不同的桌子

拖车行具有每个记录集的行数,而标题行包含记录的列名。所以本质上它就像两种类型的文件,但在一个文件中

我尝试过几种解决方案,包括使用条件拆分,但我一直未能实现这一点。我知道您可以使用脚本组件和C#来实现这一点,但我还没有实现这一点。我附加了一个图像来显示文件格式

这就是我迄今为止所尝试的

  • 我将平面文件连接编辑为ragged right,以便输出在一列中
  • 然后我创建了一个脚本组件作为源代码。其思想是使用流读取器逐行读取文件,然后创建4个输出缓冲区。2表示列标题,2表示不同的详细信息行,然后将脚本设置为在到达尾行时停止。我的意图是将每个标题行与相应的详细信息行合并,然后将它们保存到相关表中
  • 然后我使用了我从研究中得到的C代码。我从微软网站上找到了这个
  • 我使用了下面的代码:

    public class ScriptMain : UserComponent
    {
        private StreamReader textReader;
        private string RTWFile;
    
        public override void AcquireConnections(object Transaction)
        {
            IDTSConnectionManager100 connMgr = this.Connections.RTWCon;
            RTWFile = (string)connMgr.AcquireConnection(null);
        }
    
        public override void PreExecute()
        {
            base.PreExecute();
            textReader = new StreamReader(RTWFile);
        }
    
        public override void CreateNewOutputRows()
        {
            string nextLine;
            string[] columns;
    
            char[] delimiters;
            delimiters = "|".ToCharArray();
    
            nextLine = textReader.ReadLine();
            while (nextLine != null)
            {
                columns = nextLine.Split(delimiters);
                {
                    HeadersBuffer.AddRow();
                    HeadersBuffer.EmployeeNumber = columns[0];
                    HeadersBuffer.LegacyStaffID = columns[1];
                    HeadersBuffer.FirstName = columns[2];
                    HeadersBuffer.LastName = columns[3];
                    HeadersBuffer.PassportIssuingCountry = columns[4];
                    HeadersBuffer.PassportType = columns[5];
                    HeadersBuffer.PassportNumber = columns[6];
                    HeadersBuffer.PassportIssuingAuthority =columns[7];           
                    HeadersBuffer.PassportIssueDate = columns[8];
                    HeadersBuffer.PassportExpirationDate = columns[9];
                }
                nextLine = textReader.ReadLine();
            }
        }
    
        public override void PostExecute()
        {
            base.PostExecute();
            textReader.Close();
        }
    }
    
    平面文件格式的图像:

    输出缓冲区:

    FlatFileConfiguration:


    您还需要从拖车行提取信息吗

    将文件分成两个文件是最干净的方法。一旦我们了解了您的需求,我们就可以通过脚本任务来实现这一点

    更新:

    添加脚本任务并提供文件路径作为读取变量

    编辑脚本任务并将它们添加到顶部的名称空间区域

    using System.IO;
    using System.Text;
    using System.Collections.Generic;
    
    public void Main()
    {
        try
        {
            String InputFilePath = Dts.Variables["User::FilePath"].Value.ToString();
            string InputFolder = Path.GetDirectoryName(InputFilePath);
            string TrailerLine = "TotalRow";
            bool FirstFile = true;
            string line;
            List<string> FirstFileLines, SecondFileLines;
    
            // Read the file and display it line by line.  
            System.IO.StreamReader file =
                new System.IO.StreamReader(InputFilePath);
            FirstFileLines = new List<string>();
            SecondFileLines = new List<string>();
            while ((line = file.ReadLine()) != null)
            {
                if (line.Contains(TrailerLine))
                {
                    FirstFile = false;
                    continue;
                }
    
                if (FirstFile) FirstFileLines.Add(line);
                else SecondFileLines.Add(line);
            }
    
            File.WriteAllLines(InputFolder + @"\FirstFile.txt", FirstFileLines.ToArray());
            File.WriteAllLines(InputFolder + @"\SecondFile.txt", SecondFileLines.ToArray());
            file.Close();
            Dts.TaskResult = (int)ScriptResults.Success;
        }
        catch (System.Exception ex)
        {
            MessageBox.Show(ex.Message.ToString());
            Dts.TaskResult = (int)ScriptResults.Failure;
        }
    
    }
    
    使用System.IO;
    使用系统文本;
    使用System.Collections.Generic;
    公共图书馆
    {
    尝试
    {
    字符串InputFilePath=Dts.Variables[“User::FilePath”].Value.ToString();
    字符串InputFolder=Path.GetDirectoryName(InputFilePath);
    字符串TrailerLine=“TotalRow”;
    bool FirstFile=true;
    弦线;
    列出第一个文件行、第二个文件行;
    //读取文件并逐行显示。
    System.IO.StreamReader文件=
    新的System.IO.StreamReader(InputFilePath);
    FirstFileLines=新列表();
    SecondFileLines=新列表();
    而((line=file.ReadLine())!=null)
    {
    if(行包含(TrailerLine))
    {
    FirstFile=false;
    继续;
    }
    if(FirstFile)FirstFileLines.Add(line);
    else secondfileline.Add(行);
    }
    writeAllines(InputFolder+@“\FirstFile.txt”,FirstFileLines.ToArray());
    File.writeAllines(InputFolder+@“\SecondFile.txt”,SecondFileLines.ToArray());
    file.Close();
    Dts.TaskResult=(int)ScriptResults.Success;
    }
    catch(System.Exception-ex)
    {
    Show(例如Message.ToString());
    Dts.TaskResult=(int)ScriptResults.Failure;
    }
    }
    
    您好,欢迎来到SO。请告诉我们您尝试过的代码,因为如果没有这些代码,您就不太可能收到答案。也请看。后测试而不是图片。你可以发布更多的数据。我可以在几分钟内完成。而且图像中的示例不一致,甚至可能是错误的:(1)第一行中有重复的列名。(2) 第一行有5个列标题,第二行有6个数据值。你需要做得更好。@Peter:别以为你是对的。看到很多文本输入文件,看起来完全像张贴的样本。这个文件可能可以追溯到20世纪70年代。@PeterB。我为没有发布更多信息而道歉。我在SO方面是相当新的。我添加了更多信息和示例代码。至于文件格式。这是正确的格式。事实上我收到的就是这种格式。谢谢DIWP。我不需要叛徒。我可以丢弃它们。最重要的是列标题行和详细信息行显示文件可以获取的大数据?另外,“TotalRowCount”是否是尾行中的实际字符串?在完成上述脚本任务后,您可以有两个数据流分别负责将这两个文件导入到它们的表中。希望这对汉克斯有帮助。让我试试,我会告诉你的。文件不会那么大。我想我每天最多能收到50000条记录,这是可以管理的。至于拖车,一个是签证总数,另一个是护照总数。我可以添加一个单独的变量来处理第二个预告片。再次感谢DIWP谢谢DIWP。你的剧本很有魅力。非常感谢