none
datagridviewに一か月分のcsvを表示する方法。 RRS feed

  • 質問

  • 私は1日ごとにcsvファイルを作り、カレンダーで選択した日のデータがdatagridview1に表示されるプログラムを作りました。

    次はそれにさらに機能を加えて、ボタンを押せばカレンダーで示している月のデータをすべてまた別のdatagridview2に表示されるようにしたいのです。

    そのときにdatagridview2の一列目はcsvファイルの日付が表示され、2列目からcsvファイルのデータを表示するようにしたいのですが、どうしたらいいでしょうか?

    2008年12月22日 15:48

回答

  • 以下でよいのではないでしょうか?

     

    For Each Path In System.IO.Directory.GetFiles( _

    "C:\Documents and Settings\Owner\My Documents\Visual Studio 2005\Projects\家計簿\家計簿\bin\Debug", _
    yyyymm & "??.csv")

     

    また、実行ファイルの直下にcsvファイルがあるようですから、以下のようにも書けます。

     

    For Each Path In System.IO.Directory.GetFiles( Application.StartupPath, yyyymm & "??.csv")

     

    ちなみに今回は取得するファイル名が全て正確にわかるのですから、GetFilesを使用されてわざわざファイルの一覧を取得されることはないと思います。理由は以下の通りです。

     

    1.すぐ上でも述べましたが、取得するファイル名が最初から全て正確にわかっている。

    2.フォルダからファイル名一覧を取得するにはディスクを読まなければならない。これは時間がかかる処理であり、フォルダ内にファイルが増えると読み込む時間が無視できなくなる。

    3.GetFilesの結果で得られるファイル一覧の順序は保障がないため、自分でソートをしなければならない。

    2008年12月31日 1:59
    モデレータ

すべての返信

  • まず、どのような仕様でカレンダーで選択された日のcsvファイルを見つけているのでしょうか? csvファイルのレイアウトはどのようになっているのでしょうか?

     

    適当に私が考えた仕様ですと、csvファイルのファイル名を元に指定された月に属する全てのcsvファイルを見つけ、それらをデータテーブルに格納します。csvファイルの内部に日付を含ませておけば、そのデータテーブルにも日付が入っていますので、あとはそのデータテーブルをDataGridViewで表示するだけで、1列目に日付、2列目からはcsvファイルのデータが表示されます。

    データテーブルに一旦保存しますので、日付によるソートも簡単にできます。

    2008年12月22日 16:10
    モデレータ
  • お返事ありがとうございました。

     

    csvファイルはstreamReaderを使って読みこんでいます。

    ちなみに以下のようなコードです。

     

     Dim selectDate As Date = MonthCalendar.SelectionStart 
            Dim dateString As String = selectDate.ToString("yyyyMMdd") 
            Dim Path As String = "" 
            Path = Application.StartupPath & ¥ & dateString & ".csv" 

            If Not File.Exists(Path) Then 
                Exit Sub  
            End If

    Dim reader As New StreamReader(Path, Encoding.GetEncoding("Shift_JIS")
        Dim line As String = ""
            Dim result As String() = Nothing


            Do Until line Is Nothing 
                line = reader.ReadLine() 
                If line = Nothing Then 
                    Exit Do
                End If
                result = line.Split(","c) 
                datagridview.Rows.Add(result) 
            Loop
            reader.Close() '読み終える

     

     

     

    csvファイルは一日ごとにファイルを作り、行ごとに書き込み、行を列の項目ごとにコンマで区切るようにしています。

    例えば、ある行の1列目がaa、2列目がbb、3列目ccなら、メモ帳で開いたら「aa,bb,cc」という風になるようにしています。

     

    データテーブルを使わないやり方でしたいのですがそんな方法はありますか?
    2008年12月22日 17:25
  •  りり さんからの引用

    データテーブルを使わないやり方でしたいのですがそんな方法はありますか?

     

    データテーブルの使用は必須ではありませんので、大丈夫です。

     

    ロジック的には以下のように考えられてはいかがでしょうか。

     

    DaysInMonth関数を使用するとその月の最後の日付がわかります。最初の日付は1ですから、読み込むcsvファイルは、

     

    最初: カレンダーで選択された年月 & 1日
    最後: カレンダーで選択された年月 & DaysInMonthで求めたその年月の日数

     

    となります。これをループで回しながら、以下の感じで良いでしょう。

     

    Dim yymm as string
    yymm = カレンダーで選択された年月

     

    Application.StartupPath & ¥ & yymm & i.ToString().PadLeft(2, '0')  & ".csv"

     

    事前にcsvファイルの1列目に日付を仕込んでおくと簡単でしょう。

    2008年12月23日 1:30
    モデレータ
  • ありがとうございました。

    私はSystem.IO.Directory.GetFilesをつかってFor Each~構文で繰り返してファイルを取得しました。

    Dim selectdate As Date = calCalendar.SelectionStart '選択した日
            Dim yyyymm As String = selectdate.ToString("yyyyMM") '日付の表し方

            Dim Path As String = "" 'ファイルの所在

     

    For Each Path In System.IO.Directory.GetFiles( _
    "C:\Documents and Settings\Owner\My Documents\Visual Studio 2005\Projects\家計簿\家計簿\bin\Debug", _
    "ファイル名.csv")

                Dim reader As New StreamReader(Path, Encoding.GetEncoding("Shift_JIS"))
                'ストリームリーダー
             (中略)
                    '表に追加

                Loop
                reader.Close() '読み終える

            Next

     

    このファイル名なのですがselectdate.ToString("yyyyMM")のyyyyMM部分をファイル名として日の部分を??としたいです。

    とにかく取得する為に練習で最初は200812??としました。こうすると2008年12月分だけは取得できるのですが、

    カレンダーで他の月を選んでも2008年12月分しか取得されません。

    ファイル名を月と年をカレンダーで選択したものにするようにしたいのですが、どうすればいいですか?
    2008年12月30日 12:24
  • 以下でよいのではないでしょうか?

     

    For Each Path In System.IO.Directory.GetFiles( _

    "C:\Documents and Settings\Owner\My Documents\Visual Studio 2005\Projects\家計簿\家計簿\bin\Debug", _
    yyyymm & "??.csv")

     

    また、実行ファイルの直下にcsvファイルがあるようですから、以下のようにも書けます。

     

    For Each Path In System.IO.Directory.GetFiles( Application.StartupPath, yyyymm & "??.csv")

     

    ちなみに今回は取得するファイル名が全て正確にわかるのですから、GetFilesを使用されてわざわざファイルの一覧を取得されることはないと思います。理由は以下の通りです。

     

    1.すぐ上でも述べましたが、取得するファイル名が最初から全て正確にわかっている。

    2.フォルダからファイル名一覧を取得するにはディスクを読まなければならない。これは時間がかかる処理であり、フォルダ内にファイルが増えると読み込む時間が無視できなくなる。

    3.GetFilesの結果で得られるファイル一覧の順序は保障がないため、自分でソートをしなければならない。

    2008年12月31日 1:59
    モデレータ