- 締切済み
CSVファイル読み込みでズレがおきる
お世話になります。 Windows XP SP3、Access2003 で CSVファイルをインポートする処理をつくっています。 読み込むCSVファイルが大きく、必要ないフィールドが多いのですが、 下記のようにLine Input で全部読み込んで Splitでカンマ区切りでバラしてvarData(Variant型)にいれて レコードセット(インポート先の既存テーブル)に入れる時に、 必要に応じてデータ型を変更して フィールド指定ししていれるようにしています。 ところが、CSVファイルの中のデータで数件ほど ちゃんと読み込めないものがあり、 レコードセットにいれるときにエラーでとまってしまいます。 調べてみると、フィールドで取得した値がずれており、 前の方の複数のフィールドでNull値があった場合?に ずれ込むことがあるようです。 どうしたらこの現象はなおせるのか教えてください。 それとも・・・ このようにフィールド指定してレコードセットに入れ込むよりも 一度CSVファイルの全レコードを他のテーブルにインポートして、 そこからインポート先の既存の本テーブルにいれたほうがいいのでしょうか? よろしくお願いいたします。 Open ---- For Input As---- Line Input #lngFileNum, strData インポート先のテーブルをレコードセットで開く DAO、トランザクション使用 Do Until EOF(lngFileNum) Line Input #lngFileNum, strData 'データを配列へ varData = Split(strData, ",") With rs .AddNew !番号 = CLng(varData(0)) !名称 = varData(1) !受付日 = DateValue(varData(8)) !種別 = varData(10), "" !登録番号 = CLng(varData(11)) (以下略)
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- piroin654
- ベストアンサー率75% (692/917)
No4です。 No4の続きとして。 フィールド名は質問の通りの抜き出し番号になっていませんが、 リンクしたCSVをT1、追加先テーブルをT2として、以下のようなクエリ で追加。 INSERT INTO T2 ( 番号, 名称, 受付日, 種別, 登録番号 ) SELECT CLng([フィールド1]) AS F1, T1.フィールド2, DateValue([フィールド3]) AS F3, T1.フィールド4, CLng([フィールド5]) AS F5 FROM T1; あるいは、 >前の方の複数のフィールドでNull値があった場合 この意味が分かりづらいのですが、もしかしたら、 インポートしようとしているフィールドにNullデータ が存在する、という意味ならば、 INSERT INTO T2 ( 番号, 名称, 受付日, 種別, 登録番号 ) SELECT IIf(IsNull([フィールド1]),Null,CLng([フィールド1])) AS F1, IIf(IsNull([フィールド2]),Null,[フィールド2]) AS F2, IIf(IsNull([フィールド3]),Null,DateValue([フィールド3])) AS F3, IIf(IsNull([フィールド4]),Null,[フィールド4]) AS F4, CLng(Nz([フィールド5])) AS F5 FROM T1; これで対応できるものかな、というところですかね。
- piroin654
- ベストアンサー率75% (692/917)
CSVをリンクテーブルとしてはどうですか。 「外部データの取り込み」から「テーブルのリンク」 を選択し、「ファイルの種類」を「テキストファイル」 とし、ファイルのあるフォルダを選択し、当該ファイルを クリックするとウィザードが表示されます。 そこで、設定を選択し、フィールド区切り記号、 文字列の引用符を設定し、フィールドの情報で、 必要のないフィールドにチェックを入れてスキップ を設定し、OKとして最後まで進み、リンクを設定します。 あとは、普通のテーブルとして別テーブルに 追加クエリなりでデータを移し変えて加工するなり、 そのまま参照テーブルとして使用することも できます。
- layy
- ベストアンサー率23% (292/1222)
前述のリンクです。 http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110_030.html >前の方の複数のフィールドでNull値があった場合?に >ずれ込むことがあるようです。 原因がはっきりしていないので、はっきりさせること。 インポート機能は、あくまでも標準機能。 ちょっとイレギュラー、不正データがあると対応できないものも多いです。 カンマ区切りがどうしてもダメなら 1行単位で読み込むとか一時的にスペース等にして代替処理、 別のアプローチも検討です。
- nicotinism
- ベストアンサー率70% (1019/1452)
今の方向で進めるなら・・・ Ubound(varData) で確認して×ならレコードセットに入れないで エラー行として別のテキストファイルに書き込んでから 次の行に進むとか。 varDataの要素を一個ずつチェックするのは面倒ですねぇ。 ん~後は何だろ。 別案を検討されていますが、こちらでも テキストを Access にインポートした際に 区切り位置がずれる場合の対処方法 http://support.microsoft.com/default.aspx?scid=kb;ja;882221 などがありますので、『前門の狼、後門の虎』かもしれない。 試してみる価値は大いにありそうですけどね。 インポートさえ出来てしまえば、あとは焼くなと煮るなとこっちの勝手気まま (^^ゞ 具体的に何処のステップで止まってしまうのか。 (エラールーチンはコメントアウトして)エラー番号。 エラーになる実際のstrDataの内容とかが分かれば識者から回答があるかもしれない。
- layy
- ベストアンサー率23% (292/1222)
参考 エクセルでお仕事 のサイト、VBA応用を参考 ズレるなら それを使わない手でやる か それでやってもいいように仕向ける 怪しいと思われる,,を,"",に変えても同じですか。