トップ回答者
CSVファイルの読み込み

質問
-
はじめまして、現在Visual Basic 2008でプログラムの勉強を始めた者です。
参考にしている書籍のサンプルに手を加えて自分の使いやすい収支管理を作っているのですが、
CSVファイルの読み込みがうまくできません。
登録画面で入力した項目を一覧画面に表示し、CSV形式で保存するところまでは何とか出来ています。
サンプルでは起動毎に読み込むようになっているのですが、私が手を加えた方では何も読み込んでくれません。
サンプルとコードミスがないか気をつけてみたのですが、思い当たる部分が発見出来なくて…。
そこで、質問させてください。
下記にCSVファイルの読み込みを行う部分のコードを記載するので修正点をご教授いただければと思います。
また、他にどのような説明とコードがないと修正部分はわからないのであれば、ご指示いただいた内容を
追加で記載させていただきます
よろしくお願いいたします。
Sub LoadData()
Dim path As String = "MoneyData.csv" '出力ファイル名
Dim delimStr As String = "," '区切り文字
Dim delimiter() As Char = delimStr.ToCharArray '区切り文字をまとめる
Dim strData() As String '分解後の文字の入れ物
Dim strLine As String '1行分のデータDim fileExists As Boolean = My.Computer.FileSystem.FileExists(path)
If fileExists Then 'ファイルが存在すれば読み込む
Dim sr As IO.StreamReader = New IO.StreamReader(path, System.Text.Encoding.Default)
While (sr.Peek() >= 0)
strLine = sr.ReadLine()
strData = strLine.Split(delimiter)
MoneyDataSet.moneyDataTable.AddmoneyDataTableRow( _
Date.Parse(strData(0)), _
strData(1).ToString(), _
strData(2).ToString(), _
strData(3).ToString(), _
strData(4).ToString(), _
strData(5).ToString(), _
strData(6).ToString(), _
strData(7).ToString(), _
strData(8).ToString())
End While
sr.Close()
End If
End Sub
回答
-
初心者の方こそ、デバッガの使い方を知っておくべきだと思います。
Sub LoadData()
の次の行にカレットを置いて F9 を押してみてください。左端に赤い丸が表示され、その行が赤い色で反転されると思います。もう一回 F9 を押すと反転は解除されます。マウスで操作する場合はこの赤い丸が出た場所をクリックすることで同様の状態にできます。
これを「ブレークポイント」と言います。
赤い丸が表示されている状態で F5(デバッグ開始)を押してプログラムの実行を開始し、LoadData が呼び出されるような操作を行います(Load イベントとかで呼び出しているなら操作するまでもないですが)。
すると VS がアクティブウィンドウになって、先ほど赤い丸を付けた行が今度は黄色で反転されて表示され、赤い丸のところには黄色い右矢印が表示されるようになります。
これが「ブレークする」という状態です。この状態のときはプログラムの実行は停止しています。
ブレークしているとき、F10 または F11 を押すごとに、一行ずつプログラムの実行を進めることができます。なお、F10 と F11 の違いは、現在の行がメソッドを呼び出しているとき、そのメソッドの中にさらに入り込むかどうかです(ただし、そのメソッドのソースがある場合だけ)。
さて、VS の下部に「ローカル」というウィンドウが表示されます(表示されていない場合はメニューのデバッグ>ウィンドウ>ローカルを選択します)。これは各変数の現在の状態を表示するウィンドウです。
ブレーク直後、このローカルウィンドウには path 変数や delimiter 変数などが表示され、「値」のところには Nothing が入っています。一回 F10 を入力すると、黄色い反転行が次の行に進み、path 変数の「値」に "MoneyData.csv" が格納されるのが分かります。つまり、最初の行の代入処理を行ったってことですね。
このようにして一行ずつ処理を確認していき、どこで期待していない結果が格納されるのかを確認しましょう。この操作はデバッグという作業の基本の一つです。 -
> 下記にCSVファイルの読み込みを行う部分のコードを記載するので修正点をご教授
> いただければと思います。ここのところは問題ないですか? コンパイルエラーや実行時エラーは出ませんか?
↓
MoneyDataSet.moneyDataTable.AddmoneyDataTableRow型付 DataSet をウィザードで作って自動生成されたメソッドだと思いますが、行を
追加する先の DataSet, DataTable が初期化されていないような感じがします。
上記以外には、特にコードについては気がついた点はありませんが、以下の点も確認し
てください。(1) CSV ファイルは期待したとおりのものができている。
(2) CSV ファイルの文字コード(何ですか?)と Encoding.Default は合っている。
(3) フィールド値の中に、カンマ (,) や改行コード (LF, CR または CR + LF)が
含まれていない。(4) MoneyDataSet.moneyDataTable.AddmoneyDataTableRow のメソッド名、引数など
がアップされたコードと合っている。
CSV パーサーの話は、最近、他のスレッド(下記)でも話題になっています。参考に
されてはいかがでしょう。
改行コードを含む CSVファイルを読み込む方法を教えてください。
http://social.msdn.microsoft.com/Forums/ja-JP/csharpexpressja/thread/7fd293ac-b704-43fb-9f0f-0a07605f7dbaCSV ファイルのフィールドデータ内容が分からない時のデータの読み取り
http://social.msdn.microsoft.com/Forums/ja-JP/csharpgeneralja/thread/019fe7ef-70e5-453f-b746-6e243c21aa10- 編集済み SurferOnWww 2010年2月11日 9:17 誤記訂正:CVS パーサー → CSV パーサー
- 回答の候補に設定 高橋 春樹 2010年2月18日 1:17
- 回答としてマーク 高橋 春樹 2010年2月19日 1:12
-
> お気づきの点があれば、ご教授願います
先のレスで指摘した点は問題ないと言うことですよね? そうすると、今ある情
報だけでは、それ以上のことは分かりません。Hongliang さんの書かれたようにデバッガを使って、どこまで期待通り動いて
いて、どこで期待通の結果になってないのか調べたのでしょうか?
------------------------
追伸
一つだけ気になった点を書いておきます(デバッガで調べていればすぐ分かる
はずのことですが)。
fileExists は True になりますか?- 編集済み SurferOnWww 2010年2月14日 0:20 追伸
- 回答の候補に設定 高橋 春樹 2010年2月18日 1:17
- 回答としてマーク 高橋 春樹 2010年2月19日 1:12
すべての返信
-
初心者の方こそ、デバッガの使い方を知っておくべきだと思います。
Sub LoadData()
の次の行にカレットを置いて F9 を押してみてください。左端に赤い丸が表示され、その行が赤い色で反転されると思います。もう一回 F9 を押すと反転は解除されます。マウスで操作する場合はこの赤い丸が出た場所をクリックすることで同様の状態にできます。
これを「ブレークポイント」と言います。
赤い丸が表示されている状態で F5(デバッグ開始)を押してプログラムの実行を開始し、LoadData が呼び出されるような操作を行います(Load イベントとかで呼び出しているなら操作するまでもないですが)。
すると VS がアクティブウィンドウになって、先ほど赤い丸を付けた行が今度は黄色で反転されて表示され、赤い丸のところには黄色い右矢印が表示されるようになります。
これが「ブレークする」という状態です。この状態のときはプログラムの実行は停止しています。
ブレークしているとき、F10 または F11 を押すごとに、一行ずつプログラムの実行を進めることができます。なお、F10 と F11 の違いは、現在の行がメソッドを呼び出しているとき、そのメソッドの中にさらに入り込むかどうかです(ただし、そのメソッドのソースがある場合だけ)。
さて、VS の下部に「ローカル」というウィンドウが表示されます(表示されていない場合はメニューのデバッグ>ウィンドウ>ローカルを選択します)。これは各変数の現在の状態を表示するウィンドウです。
ブレーク直後、このローカルウィンドウには path 変数や delimiter 変数などが表示され、「値」のところには Nothing が入っています。一回 F10 を入力すると、黄色い反転行が次の行に進み、path 変数の「値」に "MoneyData.csv" が格納されるのが分かります。つまり、最初の行の代入処理を行ったってことですね。
このようにして一行ずつ処理を確認していき、どこで期待していない結果が格納されるのかを確認しましょう。この操作はデバッグという作業の基本の一つです。 -
> 下記にCSVファイルの読み込みを行う部分のコードを記載するので修正点をご教授
> いただければと思います。ここのところは問題ないですか? コンパイルエラーや実行時エラーは出ませんか?
↓
MoneyDataSet.moneyDataTable.AddmoneyDataTableRow型付 DataSet をウィザードで作って自動生成されたメソッドだと思いますが、行を
追加する先の DataSet, DataTable が初期化されていないような感じがします。
上記以外には、特にコードについては気がついた点はありませんが、以下の点も確認し
てください。(1) CSV ファイルは期待したとおりのものができている。
(2) CSV ファイルの文字コード(何ですか?)と Encoding.Default は合っている。
(3) フィールド値の中に、カンマ (,) や改行コード (LF, CR または CR + LF)が
含まれていない。(4) MoneyDataSet.moneyDataTable.AddmoneyDataTableRow のメソッド名、引数など
がアップされたコードと合っている。
CSV パーサーの話は、最近、他のスレッド(下記)でも話題になっています。参考に
されてはいかがでしょう。
改行コードを含む CSVファイルを読み込む方法を教えてください。
http://social.msdn.microsoft.com/Forums/ja-JP/csharpexpressja/thread/7fd293ac-b704-43fb-9f0f-0a07605f7dbaCSV ファイルのフィールドデータ内容が分からない時のデータの読み取り
http://social.msdn.microsoft.com/Forums/ja-JP/csharpgeneralja/thread/019fe7ef-70e5-453f-b746-6e243c21aa10- 編集済み SurferOnWww 2010年2月11日 9:17 誤記訂正:CVS パーサー → CSV パーサー
- 回答の候補に設定 高橋 春樹 2010年2月18日 1:17
- 回答としてマーク 高橋 春樹 2010年2月19日 1:12
-
SurferOnWwwさん
返信ありがとうございます。
>>ここのところは問題ないですか? コンパイルエラーや実行時エラーは出ませんか?
現在、コンパイルエラーや実行時エラーは出ていない状態です。
ちなみに、「Option Strict On」で行っております。
>>(1) CSV ファイルは期待したとおりのものができている。
これは問題なくできています。現時点では保存メニューか終了させるとMoneyData.csvと言う
ファイル名でCSVファイルに出力しています。生成されたファイルを見てみると正確に出来ていました。>>(2) CSV ファイルの文字コード(何ですか?)と Encoding.Default は合っている。
もしかしたらここが原因かもしれません・・・と言うかサンプルを見て記載してしまったため
CSVファイルの文字コードと合っているかを確認していませんでした。まずはCSVファイルの文字コードから調べないとです・・・>>(3) フィールド値の中に、カンマ (,) や改行コード (LF, CR または CR + LF)が
含まれていない。
これは大丈夫です。>>(4) MoneyDataSet.moneyDataTable.AddmoneyDataTableRow のメソッド名、引数など
がアップされたコードと合っている。
大丈夫なはず・・・です・・・
>>CSV パーサーの話は、最近、他のスレッド(下記)でも話題になっています。参考に
されてはいかがでしょう。
参考にして勉強してみます。
ありがとうございました。 -
> お気づきの点があれば、ご教授願います
先のレスで指摘した点は問題ないと言うことですよね? そうすると、今ある情
報だけでは、それ以上のことは分かりません。Hongliang さんの書かれたようにデバッガを使って、どこまで期待通り動いて
いて、どこで期待通の結果になってないのか調べたのでしょうか?
------------------------
追伸
一つだけ気になった点を書いておきます(デバッガで調べていればすぐ分かる
はずのことですが)。
fileExists は True になりますか?- 編集済み SurferOnWww 2010年2月14日 0:20 追伸
- 回答の候補に設定 高橋 春樹 2010年2月18日 1:17
- 回答としてマーク 高橋 春樹 2010年2月19日 1:12
-
SurferOnWwwさん
再度の返信ありがとうございました。
結論から言うとまだ上手くいっていません・・・
思い描いていたのは、プログラムを実行時に自動的にCSVファイルを読み込むはずだったのですが
やっぱり、読み込んでくれなく初期化された状態で画面が表示されます。
そこで、メニューから読み込むに行くようにして、コードをコピペしてデバッグしたところ、問題なく
読み込んでくれ、思い通りの画面が表示されました。
上記コードの何処にブレイクポイントを設定してもブレイクしないのでもしかしたら・・・と思い自分から
CSVファイルを拾いに行くようにしてみたのですが・・・
結局、何処がいけないのか分析出来なかったのですが、まずは一歩進めることが出来tました。
デバッガについて理解することが出来たので勇気を持って質問してみて良かったと思っています。