ForEachLoop コンテナーを使用して .CSV ファイルを処理する SSIS パッケージを作成しました。
すべてのcsvファイルには、最後の行に「END OF FILE」が含まれています。
最後の行に「END OF FILE」が含まれている場合、それらの CSV ファイルのみが処理されます。
どのようにそれを行うことができます。助けてください。
前もって感謝します。
ForEachLoop コンテナーを使用して .CSV ファイルを処理する SSIS パッケージを作成しました。
すべてのcsvファイルには、最後の行に「END OF FILE」が含まれています。
最後の行に「END OF FILE」が含まれている場合、それらの CSV ファイルのみが処理されます。
どのようにそれを行うことができます。助けてください。
前もって感謝します。
変数を作成するcheck
Name DataType Value
check int 0
以下のようなパッケージ デザインがあるとします。
スクリプト タスクはEnd of File
、last row
スクリプト タスクで、変数check
inReadWriteVariable
セクションと出力変数 from ForEach container
(変数名が であると仮定LoopFiles
) を inに追加します。ReadOnlyVariables
スクリプト タスクで、次のコードを追加してファイルを読み取ります。こことここでファイルを読み取る方法はいくつかあります。
public void Main()
{
int counter = 0;
string loop= Dts.Variables["User::LoopFiles"].Value.ToString();
string line;
using (StreamReader files = new StreamReader(file))
{
while((line = files.ReadLine()) != null)
{
if (line.ToLower() == "End Of File".ToLower())
{
Dts.Variables["User::check"].Value = 1;
}
}
}
Dts.TaskResult = (int)ScriptResults.Success;
}
緑の矢印の接続スクリプト タスクとデータ フロー タスクをダブルクリックします。優先順位ダイアログ ボックスが開き、次のように式を入力します。
これを行う方法はいくつかあります。1つの方法は次のとおりです。
EOF_Found ブール値
Row_Count 整数
このソリューションは、ファイル全体を 1 行ずつ読み取ることを回避します。完全を期すために、ここに Praveen のコードをマージしました。
public void Main()
{
string line = ReadLastLine(@"c:\temp\EOF.cs");
if (line.ToUpper() == "END OF FILE")
{
Dts.Variables["User::check"].Value = 1;
}
Dts.TaskResult = (int)ScriptResults.Success;
}
public static string ReadLastLine(string path)
{
StreamReader stream = new StreamReader(path);
string str = stream.ReadToEnd();
int i = str.LastIndexOf('\n');
string lastLine = str.Substring(i + 1);
return lastLine;
}