Es kommt gelegentlich vor, dass beim Importieren von Flatfiles diese durch überschüssige Zeilenumbrüche korrupt sind:

Dadurch haben wir a) Zeilen zuviel und b) sind diese unvollständig. Tritt das Problem regelmäßig auf und die Quelle kann nicht angepasst werden, muss man das Problem automatisiert behandeln. Die Standard FlatFile-Source Komponente von SSIS kann das Problem nicht handeln und gibt dem User noch nicht mal eine Fehlermeldung, da die fehlenden Spalten einfach nicht beachtet werden. Daher muss zur Lösung des Problems die Script Komponente ran. Dort parsen wir zuerst die ankommenden Zeilen per split() Befehl und weisen anschließend die resultierenden Spalten zu. Durch diese Methode erhalten wir dann auch ganz bewusst einen Laufzeitfehler (IndexOutOfBoundsException), wenn nicht alle Spalten geliefert werden. Diesen können wir anschließend per try-catch behandeln und die korrupte Zeile mit der nächsten zusammenführen:

public class ScriptMain : UserComponent
{
	// helper variable to concat incomplete rows
	private static string BadRowString = null;
	public override void PreExecute()
	{
		base.PreExecute();
	}
	public override void PostExecute()
	{
		base.PostExecute();
	}
	public override void Input0_ProcessInputRow(Input0Buffer Row)
	{
		string strRow = null;
		string strColSeperator = ";";
		string[] rowValues = null;
		
		// read raw row and if preceding row was bad, concat it with BadRowString
		strRow = BadRowString + Row.RawRow.ToString();
	
		// parse the columns
		rowValues = strRow.Split(Convert.ToChar(strColSeperator));
		
		// decide, which path to move on
		try
		{
			// check, if an exception occurs while assigning the columns
			Row.Col1 = rowValues.GetValue(0).ToString();
			Row.Col2 = rowValues.GetValue(1).ToString();
			Row.Col3 = rowValues.GetValue(2).ToString();
			Row.Col4 = rowValues.GetValue(3).ToString();
			Row.Col5 = rowValues.GetValue(4).ToString();
			Row.Col6 = rowValues.GetValue(5).ToString();
	
			// clear BadRowString for next row if no error occurs
			BadRowString = null;
		}
		
		catch (IndexOutOfRangeException)
		{
			BadRowString = strRow;
		}
	}
}