- ベストアンサー
SSISでファイルの改行コードを確認するには。
大変、お世話になっております。 SSISでファイルを取り込むパッケージを作成しています。 改行コードが「LF」でも「CR + LF」でも取込めるようにできますでしょうか。一応、取り込むファイルの改行コードは「LF」に統一するようになっていますが・・・ なかには改行コードが「CR + LF」のファイルが合ったりしますので何とか両方の改行コードのファイルを取り込むようにしたいと思っています。 可能でしょうか? 可能な場合、どのようにすればいいのでしょうか? 聞いてばかり申し訳ありませんが宜しくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
そうですか。もう少し書くと以下の通りです。 1)データフロータスクのフラットファイルソースは、LF改行のファイルの設定にします。そうすると、CRLF改行のファイルを読み込んだときにもちゃんと改行されて読み込めます。末尾に余計なCRがついてくるだけです。 a,b,c,d,e[CR] s,t,u,v,w[CR] (実際はもちろん見えませんが) 2)あとは、この余計なCRを除去すればよいわけです。 具体的にアドバイスできる方法で説明しますが、変換元と変換先の間に、スクリプトコンポーネントを挟みます(種類は「変換」)。ここを通すことで、CRを除去します。入力列の内容を書き換えて流すわけですから、「入力列」の設定で「ReadWrite」に変更します。 次に、1行だけスクリプトを書きます。列xはCRを含む可能性がある最後のカラムです。 Row.列x = Replace(Row.列x, vbCr, "") これだけです。これでCRLFのときでも末尾のCRが除去されます。 ご理解いただけますか?
その他の回答 (2)
- jamshid6
- ベストアンサー率88% (591/669)
スクリプト自体は動くと思いますが、おそらく使えないでしょう。 例を考えてみるとわかります。 ファイルA:a,b,c,d,e[CRLF]f,g,h,i,j[CRLF]k,l,m,n,o[CRLF]p,q,r,s,t[CRLF] ファイルB:a,b,c,d,e[LF]f,g,h,i,j[LF]k,l,m,n,o[LF]p,q,r,s,t[LF] このファイルをフラットファイルソースでLF改行にした場合、 ファイルA a,b,c,d,e[CR] f,g,h,i,j[CR] k,l,m,n,o[CR] p,q,r,s,t[CR] ファイルB a,b,c,d,e f,g,h,i,j k,l,m,n,o p,q,r,s,t という風に取り込まれます。「LFは改行」とした以上、区切った後の行にはもはや「LF」は存在しません。 したがってREPLACEするものはありません。 一方、フラットファイルソースをCRLF改行にした場合、 ファイルA a,b,c,d,e f,g,h,i,j k,l,m,n,o p,q,r,s,t ファイルB a,b,c,d,e[LF]f,g,h,i,j[LF]k,l,m,n,o[LF]p,q,r,s,t となり、ファイルBは1行で取り込まれることになります。1行と認識したあとで区切り文字を変更したところで、 a,b,c,d,e[CRLF]f,g,h,i,j[CRLF]k,l,m,n,o[CRLF]p,q,r,s,t というデータに変わるだけで、行数は1行のままです。
お礼
回答が遅くなって申し訳ありません。 体調が良くなくて寝込んでました。 そうですか、てっきりちゃんと動いていたのでうまくいっていると思っていました。 私が質問した内容と異なっていますがお許し下さい。 両方をカバーできるような処理はできますでしょうか。 すみませんが再度、ご教授いただけませんでしょうか。
- jamshid6
- ベストアンサー率88% (591/669)
ファイルを読み込む都度、LFかCRLFか判断するわけにはいかないので、一旦全部LFで取り込み、最終列末尾にCRがあれば除いてテーブルに入れる、というアプローチになるんではないかと思います。 派生列変換を使えれば楽ですが、私には派生列変換でCRを表現する方法が思いつきません。 ただ、スクリプトコンポーネントを使えばできます(vbCrが使えるため)。もしくは、最終列が文字列なら一旦テーブルに入れてしまって、SQLでCHAR(13)を削ってもいいかもしれません。
お礼
いつも回答していただきありがとうございます。 せっかくアドバイスいただいて申し訳ありませんがもう少し砕いて教えていただけませんでしょうか? 気を悪くしたら謝ります、申し訳ありませんが宜しくお願いします。
お礼
お礼が遅くなって申し訳ありません。 お陰様でエラーにならずに取り込む事ができました。 試しに下記のスクリプトを変更して逆もできるかと思いやってみました。 If InStr(1, Row.列x, vbCrLf) <> 0 Then Row.列x = Replace(Row.列x, vbLf, vbCrLf) End If 一応できたんですがどうも自信がなくて・・・ このような事を聞いてはいけないんですが教えてくれませんでしょうか? 申し訳ありませんが宜しくお願いします。