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