QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

CSVの取込について

お世話になります。

CSVファイルをテーブルに取込たいのですが、
良い方法はないでしょうか。
教えてください。

質問者:イオン

回答

イオンさんの書き込み (2006-04-21 09:40) より:

CSVファイルをテーブルに取込たいのですが、

良い方法はないでしょうか。

取り込み先の DBMS は何なのでしょうか?

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

CSV ファイルをデータベースに取り込むツールを知りたいのか
プログラムで CSV ファイルを読み込んで
データベースに登録する方法が知りたいのかどちらでしょうか

投稿者:かるあ

編集 履歴 (0)

すいません、大事な事を言っていませんでした。
Oracle9.1.0です。
お願いします

投稿者:イオン

編集 履歴 (0)

? 単純にインポートすればいいんじゃないんですか?

投稿者:想馬

編集 履歴 (0)

すいません、その方法教えていただけないでしょうか・・

スクリプトから簡単にできてしまうんですか?

投稿者:イオン

編集 履歴 (0)

スクリプトというかSQLを使用するか、そのデータベースに付属しているツールを使用するとかやり方は色々あります。
ただ付属のツールのやり方だけ知っていると他のデータベース(DB2とか)を使用する際にまた調べなくてはいけません。
そのため(ほぼ)共通して使えるSQLを覚えた方がいいと思います。

ここの@ITさんのサイトにもDatabase Expertとしてまとめられているし、他のサイトだとTECHSCOREさんのサイトとかも良い情報源だと思います。

ちなみにイオンさんが言われているようなスクリプトはDDLが該当すると思います(DDLのキーワードで検索してください)。
(例えば)CSVをテーブルに取り込むのはimport、逆にテーブルから出力するのはexportです。
[ メッセージ編集済み 編集者: 想馬 編集日時 2006-04-21 10:52 ]

投稿者:想馬

編集 履歴 (0)

あぅ... Insider.NET 会議室に投稿されているものだから、
プログラム側での取り込みかと思っていました。

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

レスありがとうございます。

じゃんぬねっとさんのおっしゃる通りで、
スクリプトから取込をしたいのです。

CSVファイルをユーザーに選ばせて、
そのファイルを取込みたいんですが・・
教えてください、お願いします。

投稿者:イオン

編集 履歴 (0)

言語は?
Win?Web?
何処がわからないのかわかんないっす

投稿者:Kazuki

編集 履歴 (0)

イオンさんの書き込み (2006-04-21 12:41) より:

じゃんぬねっとさんのおっしゃる通りで、

スクリプトから取込をしたいのです。

CSVファイルをユーザーに選ばせて、

そのファイルを取込みたいんですが・・

教えてください、お願いします。

情報が少なすぎるような...
Insider.NET 会議室に投稿されているということは、ASP.NET でしょうか?
クライアント スクリプトから、サーバにあげることは不可能でしょう。

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

すいませんです・・

環境はVB.NET,Oracle9.1.0です。

投稿者:イオン

編集 履歴 (0)

イオンさんの書き込み (2006-04-21 13:08) より:

すいませんです・・

環境はVB.NET,Oracle9.1.0です。

回答ではありませんが、外から見ていてじれったいので(^_^;)

イオンさんがしたいことは、Windowsアプリ(VB.NETで作成)で、クライアントにあるCSVファイルを何かのイベントの際にサーバ上のOracleに登録したい、ということでしょうか?

この回答全てをいただこうというのは無理な話かと・・・

ご自分で勉強して試した結果、ココの所が分からないので教えて欲しい、という感じで質問してみてはいかがでしょうか。

あと、他のみなさんの質問を見たことありますか?
情報は小出しにせず、一度に出さないとみなさん疲れてしまいますよ・・・

投稿者:ひろれい

編集 履歴 (0)

イオンさんの書き込み (2006-04-21 13:08) より:

環境はVB.NET,Oracle9.1.0です。

2.0 であれば TextFieldParser で読み込んで普通に INSERT じゃダメなんですか?
要は CSV を読み込むためのクラスか何かあれば、問題ないですよね。

  わんくまライブラリ Wankuma.IO.CSVReaderクラス Version1

あれ? CSV から直接 SELECT はできないんだったかな?

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

レスありがとうございます。

>ご自分で勉強して試した結果、ココの所が分からないので教えて欲しい、という感じ>で質問してみてはいかがでしょうか。
>あと、他のみなさんの質問を見たことありますか?
>情報は小出しにせず、一度に出さないとみなさん疲れてしまいますよ・・・

おっしゃる通りです、すいません。

今回取込むCSVのデータ量がかなり多く、さらにそのデータの集計をとったり、
変更したりとかなりの作業があります。

そこで、一度テーブルに落として処理をできないかと考えまして・・
一行ずつ読み込んでInsert文を発行するのでは結局同じなので他に方法はないのかと
考えたのですがなかなか実現できず・・

二次元配列として一括で取込むことも考えたのですがこれも結局わからずで。
行き詰ってます・・

投稿者:イオン

編集 履歴 (0)

イオンさんの書き込み (2006-04-21 14:56) より:

今回取込むCSVのデータ量がかなり多く、さらにそのデータの集計をとったり、

変更したりとかなりの作業があります。

そこで、一度テーブルに落として処理をできないかと考えまして・・

一行ずつ読み込んでInsert文を発行するのでは結局同じなので他に方法はないのかと

考えたのですがなかなか実現できず・・

二次元配列として一括で取込むことも考えたのですがこれも結局わからずで。

行き詰ってます・・

それは、Windowsアプリで作らなければいけないのですか?
ExcelVBAで作ってしまった方が簡単な気がしてしまいますが・・・

あと、その作業はシステムとして定常的なものなのでしょうか?
一時的な作業であれば、最初の方でみなさんが言われていたインポートを行ない、あとはSQLで好きなようにすれば良いのかな、と。

投稿者:ひろれい

編集 履歴 (0)

日次入力処理なのです・・

そのファイルデータを画面上で修正等する仕様になってます。
なので、取込から集計、入力まで全てアプリでしたいのです。

投稿者:イオン

編集 履歴 (0)

イオンさんの書き込み (2006-04-21 14:56) より:

そこで、一度テーブルに落として処理をできないかと考えまして・・

一行ずつ読み込んでInsert文を発行するのでは結局同じなので他に方法はないのかと

考えたのですがなかなか実現できず・・

やりたいことはわかりました。
どこまでが解っていて、どこでつまづいているのでしょうか

CSVファイルの読み込みは出来ますか?
データベースに接続して一行追加することは出来ますか?

二次元配列として一括で取込むことも考えたのですがこれも結局わからずで。

行き詰ってます・・

配列バインドかな?それとも配列引数?

投稿者:かるあ

編集 履歴 (0)

>CSVファイルの読み込みは出来ますか?
>データベースに接続して一行追加することは出来ますか?

行単位で読み込むことは出来るので
各行でInsert文を発行することは出来ています。

ですが、量が量なので一括で出来ればと考えまして・・
実際、各行だとかなり時間がかかってしまっています

投稿者:イオン

編集 履歴 (0)

イオンさんの書き込み (2006-04-21 16:27) より:

>CSVファイルの読み込みは出来ますか?

>データベースに接続して一行追加することは出来ますか?

行単位で読み込むことは出来るので

各行でInsert文を発行することは出来ています。

なっ・・・長かった

ですが、量が量なので一括で出来ればと考えまして・・

実際、各行だとかなり時間がかかってしまっています

データベースへの接続プロバイダは何を使用していますか?
odp.net を使用しているのであれば配列バインドが使用できます。
http://otndnld.oracle.co.jp/tech/windows/odpnet/howto/04_arraybind/content.html

また、9.2.0.4以降のサポートですが配列引数も使用できます。

投稿者:かるあ

編集 履歴 (0)

それがADO.NETなのです・・
いろいろレスして頂いてるのにすいませんです。

投稿者:イオン

編集 履歴 (0)

イオンさんの書き込み (2006-04-21 17:20) より:

それがADO.NETなのです・・

いろいろレスして頂いてるのにすいませんです。

ん?OLEDB か Microsoft製のオラクルプロバイダーを使用しているのかな?

だとしたら、PL/SQL でがんばるしか無いのかなー
CSVファイルのパスを渡して PL/SQL 内でぶん回すとか・・・

投稿者:かるあ

編集 履歴 (0)

やっぱりそうするしかないのですか・・

しょうがないですね。
かなりCSVなんて使うと思うのですが。

みなさんありがとうございました!!

投稿者:イオン

編集 履歴 (0)

ほんと、長かった。
チャットじゃないんだから、情報はまとめて書きましょう。いらない情報は簡単に削れますが、いる情報を作り出すことはナンセンスです。

読んでいると、1行1行 SQL 文を作成して、流しているように思います。
これは一番遅い処理です。

DataTable に取り込んで、DbDataAdapter.Update で流す方が、幾分早くなります。
要は、SQL 文の実行計画を使い回させることです。

また、インデックスがあるなら、インデックスを一時的に無効にすれば、幾分早くなります。

追加:
データベースへの登録は SQL*Loader にやらせて(Process クラスを使用)、アプリケーションはデータベースの内容だけを扱う、という方法もあるなぁ。
[ メッセージ編集済み 編集者: Jitta 編集日時 2006-04-21 23:19 ]

投稿者:Jitta

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。