我收到了必须导入到SQL表中的文本文件,我必须附带SSIS,因为我每天都会收到平面文件,第一行作为Customer_ID,然后输入发票详细信息,然后输入总计发票。
例子 :
30303
0000109291700080190432737000005产品名称
0000210291700080190432737000010产品名称
0000309291700080190432737000000产品名称
003 000145
所以,让我解释一下:
首先30303是客户编号
其他行发票明细
00001-> ROWID 092917-> DATE 000801904327-> PROD 370-> Trans 00010-> AMOUNT 产品名称
最后一行
003 ==>总行000145 ==>发票总数
有任何线索吗?
我将使用脚本组件作为数据流任务中的源。然后,您可以使用C#或VB.net读取文件,例如,通过使用System.IO.StreamReader,可以使用任何所需的方式。您可以一次读取一行,将值存储在变量中以写入每一行(例如,客户编号),等等。对于复杂的文件,它非常灵活。
System.IO.StreamReader
这是一个基于您的数据的示例脚本(C#):
public override void CreateNewOutputRows() { System.IO.StreamReader reader = null; try { bool line1Read = false; int customerNumber = 0; reader = new System.IO.StreamReader(Variables.FilePath); // this refers to a package variable that contains the file path while (!reader.EndOfStream) { string line = reader.ReadLine(); if (!line1Read) { customerNumber = Convert.ToInt32(line); line1Read = true; } else if (!reader.EndOfStream) { Output0Buffer.AddRow(); Output0Buffer.CustomerNumber = customerNumber; Output0Buffer.RowID = Convert.ToInt32(line.Substring(0, 5)); Output0Buffer.Date = DateTime.ParseExact(line.Substring(5, 6), "MMddyy", System.Globalization.CultureInfo.CurrentCulture); Output0Buffer.Prod = line.Substring(11, 12); Output0Buffer.Trans = Convert.ToInt32(line.Substring(23, 3)); Output0Buffer.Amount = Convert.ToInt32(line.Substring(26, 5)); Output0Buffer.ProductName = line.Substring(31); } } } catch { if (reader != null) { reader.Close(); reader.Dispose(); } throw; } }
脚本组件的“输出0”中的列配置如下:
Name DataType Length ==== ======== ====== CustomerNumber four-byte signed integer [DT_I4] RowID four-byte signed integer [DT_I4] Date database date [DT_DBDATE] Prod string [DT_STR] 12 Trans four-byte signed integer [DT_I4] Amount four-byte signed integer [DT_I4] ProductName string [DT_STR] 255
要实现这一点:
public override void CreateNewOutputRows()