ファイルの1行目をカットするには

解決


yan  2009-07-30 02:32:08  No: 146181

VB2005です。

テキストファイル(CSV)があり、1行目がヘッダ行、
2行目以降がデータ行です。

2行目以降をSQLServerのテーブルに BULK INSERT で
取り込みたいのですが、1行目の項目数が2行目以降と違う為に
うまく取り込めません。

テキストファイルの1行目だけを削除して、データ行だけの
ファイルにしてしまえば綺麗に取り込めます。

この「1行目を削除する」ための高速な方法があれば教えて下さい。
データ行は5,000行ほどあるので1行ずつ処理するのは厳しいです。

宜しくお願いします。


aho  2009-07-30 05:05:17  No: 146182

2行目以降から読み込めば?

冗談はともかく、結局一行ずつ読み込んで、二行目から別ファイルに書き込み、ファイル名変更ってやってくしかないんじゃない?


オショウ  2009-07-30 05:40:51  No: 146183

う〜ん、5000行でもメモリに余裕があるなら
CSVをOleDbでDataSetに読み込んで、それを
SQL ServerにInsertしたら?

OleDbで開ける際、1行目をヘッダーと指定
できるはずだし・・・

ただ、SqlClientででも、JETの接続子使って
CSVを開けたと思うので、SQL文1発でいける
かと・・・

※  昔やったのですが、最近のSQL Serverで
    はやったことないので、未確認です。

まぁ〜やり方はいろいろあるかと・・・

以上。参考まで


オショウ  2009-07-30 05:46:46  No: 146184

久々にT-SQLの文法調べた・・・

http://msdn.microsoft.com/ja-jp/library/ms188365.aspx?ppud=4

FIRSTROWのパラメータを指定しれば、1行目スキップ
できます。

※  をを〜進んでますナ〜勉強になりました。

以上。


特攻隊長まるるう  2009-07-30 18:19:50  No: 146185

> 久々にT-SQLの文法調べた・・・
FIRSTROW のメモに
> FIRSTROW 属性は、列ヘッダーのスキップを目的としたものではありません。
> ヘッダーのスキップは、BULK INSERT ステートメントではサポートされません。
> 行をスキップした場合、SQL Server データベース エンジンではフィールド
> ターミネータのみが調べられます。
とあって、目的は無視して良さそうだけど、フィールドターミネータを調べる
という点で質問者のあげた
> 1行目の項目数が2行目以降と違う為にうまく取り込めません。
になってるなら、結局編集が必要なのかも。
…まぁ、だとしたら質問者の説明不足ですが。

他の手段を考えるのも良いと思うけど、BULK INSERT の処理ができてるなら
ヘッダのみ削除した一時ファイルを用意してやれば良いのでは?


yan  2009-07-30 20:19:40  No: 146186

皆さん、早速ありがとうございます。
書き方が悪くて申し訳なかったのですが、

> ヘッダのみ削除した一時ファイルを用意してやれば良いのでは?

これです。
このファイル操作の処理をプログラムで高速に行う手段を探しています。

1行ずつ読み込んで、2行目以降だけ別ファイルに書き込む方法が
一番無難ですが、行数が増えてくると遅くなりそうですし。

文字列操作の Right$() のように、バイト位置を指定して
ファイルカット出来る仕組みがもしあるとすれば、
最初の改行コードの位置をしらべてから使えばいいと思うけど
はたしてそういう機能があるのかどうか。


オショウ  2009-07-30 20:22:42  No: 146187

搭載メモリの容量と相談なんですが・・・

MemoryStream使ったら、高速化は可能です。

その5000行のCSVファイル、一体サイズはどの程度?

以上。


特攻隊長まるるう  2009-07-30 20:54:50  No: 146188

最初からファイル操作の質問だったなら、この質問者さんの
感じだと幾つかテストしてそうなんだよね。。。

してないなら、それはそれでいいんだど、具体的に何秒
以内の処理にしたいとかいう具体的な情報も持ってるなら、
出し惜しみしないで全部教えて(説明して)欲しいよねー。


yan  2009-07-31 00:00:41  No: 146189

すみません。
テストはしておらずに漠然と遅いだろうなぁと思っていました。

とりあえず、素直に1行ずつ読み込んで、2行目以降だけを
別ファイルにするという方法で試したところ、
1秒もかからないことがわかったのでこの方法で行くことにします。

お騒がせしまして失礼しました。

一応経緯を説明しておきますと、
1. 1ファイル約2000行〜5000行、サイズは400kb前後
2. ファイル数は1300件ぐらい
3. 当初は1行1行読み込んでSQLServerにINSERTしていた。
4. 当然激しく時間がかかるのでBULK INSERTを検討。
5. ヘッダ行のカラム数がデータ行と違うのでそのままではダメなことが判明。
6. ヘッダ行を取り外してBULK INSERTしたい。
7. でもまた1行ずつ処理すると遅いのではないか。
8. 早くする方法はあるかなと思い質問。

こんな感じでした。
項番7.の処理時間が無問題ぐらいにBULK INSERTにしたことによる
処理時間短縮が大きかったのでよしとします。
1300ファイル処理をするのは当初だけで、
実際は夜間バッチで日々15ファイル程度なので大丈夫だと思います。

皆さんいろいろとアドバイスありがとうございました。
今後参考にさせていただきます。


yan  2009-07-31 00:02:52  No: 146190

解決のチェック入れ忘れました


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加