- ベストアンサー
途中で改行されたCSVをAccessに正常に取り込むには?
以下のようなCSVファイルがあり、これをAccessにインポートしようとしています。 フィールド1 数字7桁 フィールド2 数字2桁 ・・・・・ フィールド20 テキスト42桁 ・・・ フィールド26 数字13桁 ただ、レコードの中には長すぎるためか途中で改行されてしまっている レコードがあり、レコードが途中で切れてしまい、続きが次の行に 読み込まれると言う少し困った状態になっています。 (見たところ、フィールド20で切れているようです) 数箇所なら元のCSVを修正してから取り込めばいいのですが、全体が約80万件で、 そのうち200件以上はあるため、手作業でなく何か自動的に直す方法で対処したいと思っています。 (元のCSV自体が読み込みが重いため、手作業は困難です・・) Accessに取り込むためのいい方法はないでしょうか? OSはWinXPのSP2、Accessは2003です。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
検索や置換に正規表現を使えるテキストエディタやPerlの処理系が あれば、対処出来ます。 フィールド1が数値なので、改行直後は数字であるのが正しいはずで すよね。テキストの途中で手動で改行してしまったような場合は改 行直後が数字ではない可能性が高いので、そのパターンを見つけて 置換してしまいましょう。たとえば(\r)([^0-9])を\2にとかね。 CSVの処理はOffice製品以外を使うのがコツです。
その他の回答 (3)
- tannoy-fan
- ベストアンサー率38% (88/226)
次のような手順はいかがですか?「フィールド20」以外は数字項目であると仮定しています。 1. 次のような空のテーブルAを用意する 一連番号 オートナンバー型 フィールド1 数字7桁 フィールド2 数字2桁 ・・・・・ フィールド20 テキスト42桁 ・・・ フィールド26 数字13桁 2. テーブルAに1件、ダミーレコードを格納する 3. 次のような空のテーブルBを用意する 一連番号 オートナンバー型 フィールド20 テキスト42桁 ・・・ フィールド26 数字13桁 4. テーブルA、テーブルBにCSVファイルをインポートする 5. テーブルAの先頭レコードを削除する 5. 削除クエリを作成してテーブルAから「フィールド1」の内容が「フィールド20」であるレコードを削除する(VarType関数で判断) 6. 削除クエリを作成してテーブルBから「フィールド20」の内容が「フィールド1」であるレコードを削除する(VarType関数で判断) 7. テーブルA、テーブルBを「一連番号」で結合した、テーブルAの更新クエリを作成し、テーブルBの「フィールド20」~「フィールド26」でテーブルAの「フィールド20」~「フィールド26」を更新する この手順でテーブルAは求めるテーブルになっているはずです
- imogasi
- ベストアンサー率27% (4737/17069)
A.量的に手作業で不可能 B.質問にぴったりの操作もない(そんな特殊ニーズ向きの操作ある訳がない) であればプログラムで処理するしかない。 プログラム組めない?。●投げだが、じゃあ今回限りということで、ご親切なご回答者が現れるのを待つより他ない。 ーー そこで問題のレコードを見つける方法は、どうしたらよいか考えましたか。それが判らなければプログラムも組めない。 ーー 私の推測では CSVを文字列に読み込む(通常は1レコード) Split関数で、その文字列をカンマで分離。分離されて配列に入るが、Uboundで、これで何個に分離したかわかる。 普通は26個。 分割されたものは25個以下(多分質問者の言によると、20個らしい)なら、分断されたと看做す(X) 25以下なら次を1つ読んで継ぎ足す。 ーー ●Xについて質問者は正しいと思うか? ●80万件CSVファイルを例えばLINE INPUTで読んで、辛抱できないくらい長時間かかると思うか(y) >元のCSV自体が読み込みが重いためー>少し時間はかかるのは当然だが、私には信じられないが。 ともあれ、CSVファイルを読まなきゃプログラムで処理できないのはあたりまえ。 ーー この2つぐらいについての見解を補足しておいたら。
改行しているレコードに規則性がなければ無理でしょうね。 フィールド20までの項目で判断するとか。 レコードの先頭フィールドでフィールド1か21か判断するとか。