2016-09-09 89 views
0

フォルダのディレクトリからすべてのファイル名を取得する際に、その行数を取得しようとしています。 (可能であれば、ファイルサイズもバイト単位で)Microsoft Visual Studio 2010 Shellを使用しています。ここで私はこれまで何をやったかです:SSISでフラットファイル名を取得し、異なる列の複数のフラットファイルから行数をどのように取得しますか?

私はForeachループコンテナを作成して、私はループにオーバーするフォルダへの変数にのforeachファイル列挙子と式に列挙子を設定します。私は*.*とファイルセクションを残し、Name Onlyを取得するように頼まれました。変数マッピングをFullFilePathという新しい変数に変更しました。コンテナはPackage、値のタイプはString、値は空です。

次に、データフローをループに追加しました。フラットファイルソース、行数、およびOLE DB宛先を追加しました。フラットファイルのソースプロパティ式をForeachループコンテナ式の同じフォルダ変数に変更しました。私は行番号機能(Int32、値0)にRecordCount変数を追加しました。 OLE DB Destinationは、OLE DB Destinationという名前の新しいテーブルを作成します。

次のステップは、実行するSQLタスクで、Insert Into DBO.FileData (FileName,RowCount) Values (?,?)です。 2つのパラメータマッピングを設定しました.1)Foreachループコンテナの変数名、FullFilePathおよびデータ型VarChar、2)Row Count、RecordCount、Data Type Longの変数。

私は次に別を持っていますデータフロータスクによって作成されたテーブルを削除するSQL実行タスクを実行します。問題は、これらすべてのステップでパッケージがまだ完了しないということです。それは実際にハングアップし、実行前に失敗します。それは言う:

Warning: Access is denied. Error: Cannot open the datafile 'FullFilePath' Error: Flat File Source failed the pre-execute phase and returned error code 0xC020200E.

何か私は間違っている可能性がありますか?写真が役立つかどうか教えてください。

+0

最初に、フルパスとファイル名をフラットファイルソースに渡す必要があります。フラットファイルソースには、フォルダに渡すだけでは通過できません。次に、フラットファイルソースに現在設定されているフォルダパスにforeachループによって生成されたファイル名を付ける必要があります。これはフラットファイルソース上の式(接続文字列)によって設定されます。それらのすべては、そのデータフローと概念を使用して読んでいる各ファイルのメタデータを変更する必要があります。スクリプトのタスクでそれをやって、オブジェクト変数を返すほうがはるかに良いでしょう。 – SFrejofsky

+0

@SFrejofsky私はそれを理解しました。あなたに感謝します。 –

答えて

0

私はこれを最終的に考え出しました。さまざまなヘッダーと列数ですべてのファイルをループするために、フラットファイルソースのオプションを変更して、「ファイルにヘッダーが含まれています」を選択解除することにしました。これにより、すべてのファイルが同じ#1列を持つことができました。デフォルトでは、列0(すべてのファイルの最初の列はある種の数値フィールドまたはID)です。私はこれを行数を通してマップし、SQLテーブルに挿入することができました。その後、Foreachループを終了し、ファイル名と行数を別のSQLテーブルにスクライブして、数を記録することができました。しかし、実際にはかなり長い時間がかかっています。つまり、14時間以上実行されており、13個のファイルしかカウントされていません。いくつかのファイルが250K +の行であると認められていますが、これは長くかかるとは思わないでしょう。

+0

それは決してそれを取るべきではありません。あなたがforeachループが間違っていて、あなたがファイルを何度も反復しているのであれば、それが長くかかるはずの唯一の理由です。私は、1時間ほどしかかかりませんでした。データフローを監視して、データが重複していないことを確認するために読み込んでいるテーブルを使い切っているかどうかを確認しましたか? – SFrejofsky

+0

@SFrejofsky私はそれがパッケージプロセスを経て、「Column 0」をOLE DBテーブルに書き込むのに最も長い時間を要しているのを見ました。私はそれが書いていたテーブルをチェックし、それは重複しませんでした。フラットファイルから書き出し、ループが完了した後にテーブルを切り捨てます。パッケージを「Raw File Destination」を使用するように変更し、2時間以内にすばやく完了しました。すべてうまくいった!私はなぜそれが遠隔サーバーにそれを実行しているので、多分SQLテーブルに書き込むためにそれが長い時間がかかっていたのか分からないのですか?または、サーバーがビジーだったのでしょうか? –

関連する問題