No.8ベストアンサー
- 回答日時:
100万件のデータをCSVで読み込むなんて、大変ですね・・・
私が伝えた方法でやるとしたら、
バイナリで開く
GETで取得
REPLACE関数でダブルコーテを変換(っていうかダブルコーテを削除してしまう)
バイナリで開く
PUTでファイルに出力
という方法で置き換えができますが。。。
しかし大きいファイルを一度に行うとパフォーマンスが下がる気がします。
ですので、何分割かで読み込む必要があるかもしれません。
要は重要なのは件数ではなく、カラム数やファイルサイズの方です。
それではがんばってください。
No.7
- 回答日時:
バイナリで読み込む方法もあります。
参考URLは一度にファイルを取得する方法が出てきます。
イモガシさんの延長ですが、そのあと改行コードやカンマでSplit関数を使用するようにしてはいかがでしょうか。
参考URL先の「subTestRead」関数を使用して
dim varWk as variant
subTestRead "c:\test.csv",vbcrlf,varWk
とすると、行単位で配列にセットされます。
あとはUBOUNDとLBOUND関数を使用して、配列分のループをまわし、その中でSplit関数でカンマを区切ってあげると、できると思います。
参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=169686
この回答への補足
いろいろ分かったことを補足します。
"aaa","bbb","ccc"のような区切りの
CSVファイルをサーバー上(SQLServer2000)のテーブルに格納するには
1.Bulk Insert
2.BCP
3.DTS
という方法もあるということが分かっていろいろ
調べたり質問した結果、
BULK INSERTで読込むことは可能だが、”を含んでロードしてしまうので、”を削除してからロードしないと駄目ということが分かりました。"を削除してから読込んでもいいのですが、例えば100万件のデータを読込む場合、"を削除する時間がどのくらいかかるのだろう?と思いました。
その問題はあるものの、一応選択肢は増えました。
(各項目が""で区切られているのが曲者のようです・・・)
100万件のデータを読込もうとしています。
総合的に見て少しでも早い方法を選択したいのですが、
ループさせて読込むのと
" を削除してからBULK INSERT で読込むのはどちらが早いのでしょう?
実際にやってみればいいのですが、感覚的な回答でいいのでみなさんの
考えを聞かせてもらえると大変助かります。
また、BCP や DTS を使えば各項目が " で区切られたファイルでも
スムーズに読込むことが実現可能なのかどうか(速度無視で)どなたか
分かる方教えてください。
No.6
- 回答日時:
#5のものです。
私の例が1レコード3項目(エクセルで言えば1行3列に当たる)を考えていたからなんで、3の倍数が出たのです。3に意味はありません。それはそれとして、確信が持てないのですが、ファイルを読む時に、Input #1,a1,a2,a3の代わりに、Line Input #1,aとして、プログラムでaを、「,」でa1,a2,a3にSPLIT(分割)して、a1,a2,a3の処理をしたほうが、少し速くないですかね。
この回答への補足
ありがとうございます!!
そういう少しでも速くなりそうなテクニックを探していたのです。
実際速くならなくても構いません。
なりそうじゃないかなー、程度のものでも教えて下さると助かります(他の方も)
DTSパッケージなるものを使用すると
速そうなので、それについて今度は調べ始めました。
別に質問したので、もし何か少しでもわかることがあれば教えてくだされば
幸いです。よろしくお願いします。
No.5
- 回答日時:
#2のものです。
大変長い時間がかかるとのこと。実感したことはないのですがパソコンで何十万件の
処理はむりなんですね。
原因はハッキリしていると思います。DISKのREAD
WRITEに時間がかかっているからなのです。
I/Oネック。DiskのREAD回数を減らすには
1回のREAD単位に、フィールドを1組でなく、多数組み入れることを、昔の大型コンピュターは工夫していました。しかしもう既にファイルが出来あがっているし、VBという言語ではそう言う考えもなく、無理でしょう。
APIレベルで高速READの方法があるかどうか私には判りません。改めてそれに絞ってご質問されて、専門家の
ご回答を待ってはとおもいます。
Input #1, a1, a2, a3をInput #1, a1, a2, a3 ,a4,
a5,a6・・・(3の倍数で)ふやしても少し短くなりませんでしょうかね。処理プログラムは少し変りますが。
この回答への補足
再びの回答ありがとうございます!
そうなんですか。
今、Bulk Insert を使ってできないか検討中なのですが、うまくいきません。
うまくいかない場合は、少しでも速度が速くなる方法を模索したいと思います。
あと上記の3の倍数でというのはどういう意味なのか分からないです・・
すみません。
No.4
- 回答日時:
失礼しました。
SQL鯖なのですね^^;
SQL文一発はADOかDAOのアクセスDBオンリーのようです。。。
実験してみたらできなかった。。。
実験した結果は、誰かが使ってくれるかも知れないので、一番後ろに載せておきます。
バルクは今まで使用したことがないので、ちょっと調べてみました。
ここの掲示板に思いっきりサンプル載ってました。
http://oshiete1.goo.ne.jp/kotaeru.php3?q=306391
http://oshiete1.goo.ne.jp/kotaeru.php3?q=262720
ストアドで書いておくといい感じかもしれませんね。
ってなわけで、無意味にADOでAccessDBに一発インポート
だれか使って!!
※CSVファイルは要ヘッダ
Private Sub Command1_Click()
Dim adoCn As ADODB.Connection
Dim strSQL As String
'接続
Set adoCn = New ADODB.Connection
adoCn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=D:\db1.mdb;"
'実行
strSQL = getImpSQL(IMPORT_TBL, CSV_FILE)
adoCn.Execute strSQL
'終了
adoCn.Close
Set adoCn = Nothing
End Sub
Private Function getImpSQL(inTblName As String, inFilePath As String)
Dim varWk As Variant
Dim strPath As String
Dim strFile As String
Dim strSQL As String
'ファイルパスとファイル名に分解
varWk = Split(inFilePath, "\")
strFile = varWk(UBound(varWk))
varWk(UBound(varWk)) = ""
strPath = Join(varWk, "\")
'SQL文創生
strSQL = "insert into " & inTblName & " select * "
strSQL = strSQL & "from [Text;DATABASE=" & strPath & "].[" & strFile & "]"
getImpSQL = strSQL
End Function
この回答への補足
DTSパッケージなるものを使用すると
速そうなので、それについて今度は調べ始めました。
別に質問したので、もし何か少しでもわかることがあれば教えてくだされば
幸いです。よろしくお願いします。
No.3
- 回答日時:
※DBの接続先
※DBの接続方法を書いてください。
もしADOやDAOならDBの種類を問わずに、1文のSQL文で可能です。
oo4oなら先に述べられた方々の言う通りのやり方がメジャーだと思います。
質問には環境を書くようにしましょう。
この回答への補足
TAGOSAKU7様、すみません。
DBの接続先 SQLServer2000
DBの接続方法 RDO
これでOKでしょうか?
1文のSQLで可能ということですが、その方法がBESTのような
気がします。教えて頂けないでしょうか?
それとは関係ないかもしれませんが、
自力で調べたところ bulk copy? bulk Insert?
というのが何だか関係ありそうな気がするのですがどうでしょうか?
ご教授くださると大変助かります。
No.2
- 回答日時:
1レコード(1人分の記録項目など)が3項目(3フィールド)とした時の例をあげます。
下記をテストして、納得してください。フィールド数はa1.a2・・・anと増やしてください。openのファイル名とパス名は適宜変更のこと。Sub test01()
Dim a1, a2, a3 As String
Open "c:\My Documents\book1.csv" For Input As #1
readf:
If EOF(1) Then GoTo owari
Input #1, a1, a2, a3
MsgBox "レコード読みこみ"
MsgBox a1
MsgBox a2
MsgBox a3
GoTo readf
owari:
Close #1
End Sub
実行して、数レコード表示して、表示がうるさくなったら、CTRL+PAUSEで中止してください。
あとはMSGBOXのところを(置換えて)データベースのフィールドにセットして、レコードを書き出すことになります。
「データベース」は何ですか。MDBファイルですか?
「データベース」ファイルは1種類ではないですよ。
この回答への補足
imogasi様回答ありがとうございます。
教えられた方法でやってみました。
うまくいったのですが、次の問題が出てきました。
例えば件数が少ない時は、いいのですが
100万件のデータを読込まなければいけなくなりました。
上記の方法だと時間がかかりすぎるので、42万件ほどで4時間・・
何か別の方法はないでしょうか?
どうかお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Excel(エクセル) csvファイルをExcel形式で読み込むには 2 2023/07/03 13:09
- XML PHP.laravelについて 1 2023/07/06 15:26
- Excel(エクセル) PowerQueryに詳しい方教えてください(Office365) 1 2022/07/24 21:11
- Access(アクセス) CSVファイルの「0落ち」にVBA 6 2023/02/02 15:27
- その他(プログラミング・Web制作) Sikulix2.0.5(Jython2.7.3)でcsvを読込WEB検索条件にpasteで文字化け 1 2023/03/31 11:02
- Excel(エクセル) エクセル テーブル機能の不明点 2 2022/04/14 14:10
- Excel(エクセル) エクセルでcsvファイルを開いてVBAを使いたい 7 2022/04/28 11:12
- Excel(エクセル) Excel Powerクエリーの質問、行数指定は可能でしょうか? 2 2022/08/22 12:54
- C言語・C++・C# C言語の質問です。バイナリ形式で保存されたWindows Bitmap形式の画像ファイルを読み込み、 3 2023/07/19 14:58
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッチでCSVを処理する時、空の...
-
カンマ区切りのCSVファイルから...
-
CSV形式での保存時に”文字列...
-
データ解析ソフトRでのファイル...
-
csvファイルのデータの間引きを...
-
csvファイルのデータの一部を取...
-
Excelで作成した単語帳をp-stu...
-
csvファイルでの日付設定「yyyy...
-
エクセル形式のファイルの読み込み
-
エクセルVBA 大容量CSVファイル...
-
CSVファイルの項目行を削除...
-
ACCESS CSVファイルをインポ...
-
Excel VBAにてCSVファイルを読...
-
csvファイルから列を選択しchar...
-
csvファイルを列数ごとに分割す...
-
Windows10でコマンドプロンプト...
-
ファイルのアクセス回数について
-
frxファイルの役目
-
エクセルvbaでdocuworksprinter...
-
エクセルのプロパティーでセキ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
カンマ区切りのCSVファイルから...
-
csvファイル 項目数取得
-
バッチでCSVを処理する時、空の...
-
csvファイルでの日付設定「yyyy...
-
マクロから出力されるcsvのダブ...
-
CSV形式での保存時に”文字列...
-
データ解析ソフトRでのファイル...
-
VBAでcsvファイルを読み込んで...
-
複数のcsvファイルをExcelに一...
-
COBOLでCSVをインプットにして...
-
エクセルVBA 大容量CSVファイル...
-
【C#】パス名で無効な文字
-
CSVファイル作成
-
csvファイルのデータの一部を取...
-
CSVファイルの項目行を削除...
-
EXCEL|csvで保存→開くcsvを閉じる
-
複数のCSVファイルのAccessテー...
-
巨大なCSVの加工(指定列のみの...
-
COBOL85でのCSVファ...
-
csvファイルのデータの間引きを...
おすすめ情報