@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

CSVファイルのデータをDataSetに格納する方法

1
投稿者投稿内容
seberg
常連さん
会議室デビュー日: 2005/03/03
投稿数: 28
投稿日時: 2005-03-03 21:23
こんにちは。初めて投稿します。

VB.netで、CSVファイルのデータをDataSetに格納し、
DBに投入するプログラムを作成中です。そこで、
悩んでいる点が2点あります。

1.csvデータの2行目までは不要。
2.データの中に金額の桁区切りのデータがあり、
桁表示せず数値に変換してにDBに投入しなければならない。

今のところ以下のように作成しています。
'SQL文の設定
oCommand.CommandText = _
"SELECT 管理NO,明細摘要,貸方 FROM aaa.csv where 勘定科目 = " & "1111"

'データを取得する
oDataAdapter.SelectCommand = oCommand
oDataSet.Clear()
oDataAdapter.Fill(oDataSet)

ですが、これでは問題点が解決していないのです。。。
問題点1.について
上記select文で取得する項目名が、csvファイルの1行目にセット
されている必要があり、処理前にcsvファイルを加工しなければなりません。
加工するのはパフォーマンス低下のためNGでした。

問題点2.について
replace(値,",","")を上記select文で行おうとしたのですが、
思うようにいきませんでした。datasetに格納する前に数値に変換しなくては
行けないと思うのですが、方法がわかりません。
CSVを加工するのは、パフォーマンス低下のためNGでした。

どなたかアドバイスいただけませんでしょうか。
よろしくお願いいたします。

【開発環境】
VB.net2003
OS Win2000SP4
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2005-03-04 01:18
oDataAdapter.Fill(oDataSet)
このあと「DBに投入」するのですよね?
「問題点2.について」はoDataSetを編集するのではだめですか?

「問題点1.について」は何が問題なのかちょっと理解できませんでした。
csvファイルははじめから終わりまで変更はないのですよね?1行目が
「管理NO,明細摘要,貸方,勘定科目」みたいに項目名がはいっているのですよね?
「処理前にcsvファイルを加工しなければなりません」はなぜですか?

「csvデータの2行目までは不要」とは「DBに投入」する際に不要ということですか?
ならoDataSet(のTable)から削除してから「DBに投入」すればいいのでは?
seberg
常連さん
会議室デビュー日: 2005/03/03
投稿数: 28
投稿日時: 2005-03-04 10:02
説明不足ですみません、問題点1.の問題は、CSVファイル2行目までは
1行目→転送用,,,
2行目→管理NO.,明細摘要,貸方,勘定科目
となっているのです。1行目を項目名とするためにCSVファイルを加工
しなければならないと思いました。
ですが、「csvデータの2行目までは不要」は「DBに投入」する際に不要なので、
DataSetから削除するように変更してみます。

問題点2についても、ご指摘頂いたDataSetを編集する処理を
調べてやってみます。ご指導ありがとうございます。

seberg
常連さん
会議室デビュー日: 2005/03/03
投稿数: 28
投稿日時: 2005-03-04 15:57
ご指導頂いた方法でプログラムを作成しました。
ありがとうございました。

すみません、動作確認はしているのですが、
処理終了時の記述で気になっている点があります。

Dim oDataSet As New DataSet
Dim tb As New DataTable
Dim Row As DataRow

Row.Delete()
Replace(Row(5), ",", "")
tb.AcceptChanges()

oDataSet = Nothing
tb = Nothing

1.datasetの列削除、桁表示削除の後、最後に
tb.AcceptChanges()で処理を確定しているのですが、OKでしょうか?

2.処理の最後に、datasetとdatatableのみ
oDataSet = Nothing
tb = Nothing
と記述していますが、OKでしょうか?

よろしくお願い致します。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2005-03-04 22:50
引用:
1行目→転送用,,,
2行目→管理NO.,明細摘要,貸方,勘定科目
となっているのです。1行目を項目名とするためにCSVファイルを加工
しなければならないと思いました。

CSVで項目名は1行目に書いておくべきです。が、「転送用」が必要ならそういう
わけにもいかないのでしょうかね。接続文字列で「Text;HDR=NO」と書けば先頭行も
データとして取り込むようになるので、そうして2行消すとか。ただしフィールド名
がF1,F2のようになります。2行目を項目名にする設定があれば楽ですが、どうだろ。
いまさらですがJet.OLEDB.4.0の話ですよね?

引用:
1.datasetの列削除、桁表示削除の後、最後に
tb.AcceptChanges()で処理を確定しているのですが、OKでしょうか?

2.処理の最後に、datasetとdatatableのみ
oDataSet = Nothing
tb = Nothing
と記述していますが、OKでしょうか?


ここらへん私詳しくないので答えは出せませんが、何の観点からの「OK」ですか?
何か問題がおきてるわけじゃないんですよね?何かを参考にしてそう書いたのでしょうし。
Nothingはその後使わないんならいいのでは?disposeなんてメソッドもあります。

[ メッセージ編集済み 編集者: べる 編集日時 2005-03-05 09:00 ]
seberg
常連さん
会議室デビュー日: 2005/03/03
投稿数: 28
投稿日時: 2005-03-07 09:53
べるさん、おっしゃるとおり、Jet.OLEDB.4.0を使っていました。

引用:
--------------------------------------------------------------------------------

1.datasetの列削除、桁表示削除の後、最後に
tb.AcceptChanges()で処理を確定しているのですが、OKでしょうか?

2.処理の最後に、datasetとdatatableのみ
oDataSet = Nothing
tb = Nothing
と記述していますが、OKでしょうか?
--------------------------------------------------------------------------------
参考にしていたコーディング例はあったのですが、自分と同じステップで
書いてあったわけではなかったこと、
プログラミングする上で、コーディング上メモリの開放を正しくできているかが
自分で気になっていたことから、このようなお問い合わせをしてしまいました。
OK→正しくメモリの開放ができているか、とお問い合わせすべきでした。。。
ご返答感謝です。ありがとうございました。


べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2005-03-07 20:36
メモリの開放について問題でもおきない限り私は気にしてません。.NETではあまり
気にする必要はない、くらいに考えてます。Disposeできるオブジェクトはいらなく
なったらDisposeする、程度です。

メモリの開放ネタはこの掲示板にも結構あった気するので探してみるといいかも。

Nothingしておくとガベージコレクションのときに開放される(であってるかな?)。

http://www.microsoft.com/japan/msdn/net/mag00/GCI.asp
seberg
常連さん
会議室デビュー日: 2005/03/03
投稿数: 28
投稿日時: 2005-03-10 14:01
べるさんアドバイス&参考URLありがとうございました。
この掲示板は初めて利用させて頂きましたが参考になることが
沢山あるのでメモリ開放についても自分でもっと調べてみます。
御礼が遅くなりすみませんでした。
1

スキルアップ/キャリアアップ(JOB@IT)