tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル文字が表示できない。
記事No11709
投稿日: 2016/08/08(Mon) 12:12
投稿者耳たぶ黒
お世話になります。超初心者の耳たぶ黒です。
Win10の元VB2015proで作業しています。

花ちゃんさんがアップしてくださっていた「CSVデータを読み込んでチャートに表示される。」プログラムを利用させてもらっていました。
この前まではチャートを表示できればよかったのでそれで良かったのですが、CSVデータに文字データ書き込む必要がでてきました。文字を書き込むところまでは出来たのですが、CSVデータを読み込んでも、数値しかテーブルに表示されません。JETのプロパティを変えれば済むことなのでしょうか?調べかたが悪いのか?JETPROVIDERについて詳しく書かれている記事が見つけられません。JETよりいい方法がありますか?アドバイスを頂けるとたすかります。

元データ        |     読み込んだテーブル
1、現場,山梨県都留郡  |     1、   
2、日付,20160805    |     2、  ,20160805      
3、                     |        3、
4、0,0,0,12:10:15      |      4、0,0,0,12:10:15
5、1,2,2,12:10:16     |      5、1,2,2,12:10:16

読込んでいるプログラム

Dim ds As New DataSet
        Dim columns As Integer
        Dim rows As Integer
        Dim FolderPath As String
        Dim csvFileName As String
        '「開く」ダイアログを表示
        If OpenFileDialogCsv.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
            'ピクチャーボックスに選択したファイル名を指定
            FolderPath = IO.Path.GetDirectoryName(OpenFileDialogCsv.FileName)

            csvFileName = IO.Path.GetFileName(OpenFileDialogCsv.FileName)
            TextBox1.Text = FolderPath & "\" & csvFileName
        End If
        Using cn As New System.Data.OleDb.OleDbConnection
            cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FolderPath &
                  ";Extended Properties=""Text;HDR=YES;IMEX=1;FMT=Delimited"""
            Using da As System.Data.OleDb.OleDbDataAdapter =
               New System.Data.OleDb.OleDbDataAdapter("SELECT * FROM " & csvFileName, cn)
                da.Fill(ds, "Table1")
                Chart1.DataSource = ds                       'Chart に表示するデータソースを設定
                columns = ds.Tables(0).Columns.Count - 1      'データの系列数を取得
                rows = ds.Tables(0).Rows.Count

            End Using
        End Using

[ツリー表示へ]
タイトルRe: 文字が表示できない。
記事No11712
投稿日: 2016/08/09(Tue) 16:48
投稿者耳たぶ黒
> お世話になります。超初心者の耳たぶ黒です。
> Win10の元VB2015proで作業しています。
>
自分でもう少し調べた事、確認したこと。
JETProviderはshift_jisでないと読み込まないみたい。

読み込んでいるCSVファイルはstreamWriter、shift-jis形式で作成
一応、ファイルも確認してSJIS(Shift_jis形式)だった。
ファイル全体の文字コードがShift_jisなのに、中身の文字は別なんてことがあるのだろうか?

CSVファイルの中身をエディターなどで確認すると、ちゃんと文字が表示されているのは確認した。
そのファイルを作成中のプログラムに読み込ませると基本的にテーブルに表示される文字は全て、NULLになってしまう。

ただ、たまにCSVファイルを読み込んで、テーブルに文字が途中まで表示されている時があった。

表示できないファイル、表示できたファイルどちらもSJIS形式でした。

出力側が悪いのか?入力側が悪いのか?

[ツリー表示へ]
タイトルRe^2: 文字が表示できない。
記事No11713
投稿日: 2016/08/10(Wed) 10:21
投稿者まりもん
提示されたソースを動かしてみました。

まず、ConnectionStringでHDR=YESとなっているので、1行目がヘッダとして処理されます。
これにより、
ds.Tables(0).Columns(0).ColumnNameに"現場"が入ります。
ds.Tables(0).Columns(1).ColumnNameに"山梨県都留郡"が入ります。

それ以降ですが、
Columns(0)〜Columns(2)はInt32型、Columns(3)はDateTime型となっていました。
ですので、
日付,20160805
この行の"日付"は文字列でInet32型には変換出来ない為、
ds.Tables(0).rows(0).item(0)はDBNullとなります。

この場合、文字コードの問題ではないと思います。
このファイルをどのように処理したいのか分かりませんが、CSVとして読み込ませる場合
各行は同じ意味合いのデータである必要があると思います。
もし、このファイルで読み込むのであれば、自前で1行づつ読み込んで、解釈するほうが
いいのではないかと思います。

[ツリー表示へ]
タイトルRe^3: 文字が表示できない。
記事No11715
投稿日: 2016/08/10(Wed) 17:20
投稿者耳たぶ黒
まりもんさん返信ありがとうございます。

どうしても同じ形式のデータだけだと情報が足りないので、
CSVファイルの頭にいろいろ情報付けて使用したいんです。
プロバイダー使用で読み込む時はデータ型をString、Date型などを混在させるのは難しいのでしょうか?
よく考えたら、別々に読み込むのもありですね。
例えば、最初の何行かだけString型で読み込もうとするのだったら、どうやったらデータ型の指定はできるのでしょか?

よく確認したらデータテーブルに読み込んだデータを時刻が変になってました。

元データ        |     読み込んだテーブル
1、現場,山梨県都留郡  |     1、   
2、日付,20160805    |     2、  ,20160805      
3、                     |        3、
4、0,0,0,12:10:15      |      4、0,0,0,1988/12/30 12:10:15
5、1,2,2,12:10:16     |      5、1,2,2,1988/12/30 12:10:16


全く意味がなかったですが、時刻の表示が変だったのでプロバイダーを変えてみました。
当初JETプロバイダーを使っていましたが、古いんですね。
ACE.OLEDB.12.0に変更しました。


今はStreamReaderで読見込む方が良いのかと思い、チャレンジ中です。
コンソールによる出力ウィンドウへの出力はOKでした。
これをDataTableに出力したいのですが、自分が無知過ぎてなかなかできません。
これをスパッとDataTableに移行する方法なんてないのか?なんて思ってます。
今はConsole.Writeの部分をTB.Rows.Add()に変更したのですが、上手く読んでくれません。



出力結果------------------------------------
スレッド 0x1b90 はコード 0 (0x0) で終了しました。

項目    値            
現場名:    市川市三田村様邸新築工事            
場 所:    市川市            
試験者:    黒山            
日付    2016/08/10            
試験体No:    1            

No    荷重    変位    時刻    FDN
0    0    0    09:37:38    0
1    0.1    0.59    09:37:38    7
2    0.0    0.61    09:37:43    21
3    0.0    0.61    09:37:47    34
4    0.0    0.62    09:37:49    40
5    0.1    0.62    09:37:51    44
6    0.1    0.62    09:37:52    48
7    0.1    0.61    09:37:54    54
8    0.0    0.62    09:37:55    59
9    0.0    0.61    09:37:57    63
10    0.0    0.62    09:37:58    67

---------------------------------------------



プログラム------------------------------------

Dim ds As New DataSet
        Dim columns As Integer
        Dim rows As Integer
        Dim FolderPath As String
        Dim csvFileName As String
        Dim TB As DataTable = ds.Tables.Add
        '「開く」ダイアログを表示
        If OpenFileDialogCsv.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
            'ピクチャーボックスに選択したファイル名を指定
            FolderPath = IO.Path.GetDirectoryName(OpenFileDialogCsv.FileName)

            csvFileName = IO.Path.GetFileName(OpenFileDialogCsv.FileName)
            TextBox1.Text = FolderPath & "\" & csvFileName
        End If
        
        Try
            Using sr As New System.IO.StreamReader(TextBox1.Text, System.Text.Encoding.Default)
                'ファイルの最後までループ
                Do Until sr.Peek() = -1
                    Dim temp() As String
                    temp = Split(sr.ReadLine(), ",")
                    '※1 データの項目数が不定の場合は下記のようにして取得してください。
                    Dim i As Integer
                    For i = 0 To temp.GetUpperBound(0)
                        If i = temp.GetUpperBound(0) Then
                            Console.WriteLine(temp(i))
                        Else
                            Console.Write(temp(i) & vbTab)
                        End If
                    Next
                Loop
            End Using
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try

-------------------------------------------------

[ツリー表示へ]
タイトルRe^4: 文字が表示できない。
記事No11716
投稿日: 2016/08/10(Wed) 19:02
投稿者耳たぶ黒
耳たぶ黒です

まりもんさん、よかったら先ほどの返信内容はどうやって調べられたのか教えてもらえませんか
自分は知識が全然無いので、どこかプログラムの途中にSTOPを記述して。
プログラムをデバッグして止めて。データテーブルをクイックウォッチで確認するぐらいしかできません。
一応、こんな感じにメッセージボックスでしらべてみました。

dscol = TB.Columns(2)
        MessageBox.Show("フィールドの型は:" & dsCol.DataType.ToString)
*************************************************************************
それ以降ですが、
Columns(0)〜Columns(2)はInt32型、Columns(3)はDateTime型となっていました。
ですので、
日付,20160805
この行の"日付"は文字列でInet32型には変換出来ない為、
ds.Tables(0).rows(0).item(0)はDBNullとなります。
*************************************************************************

ちなみに下記プログラムのように★部分を追記して
1列目、2列目をstring型にしてからデータテーブルにCSVファイルを読み込んだつもりなのですが、
やはり表示されない状態でした。データを格納しているタイミングがわるいのか?良くわかりませんでした。先ほど記述したメッセージボックスのやつでデータ型を確認したらSTRING型だったんですがね。


Dim ds As New DataSet
        Dim columns As Integer
        Dim rows As Integer
        Dim FolderPath As String
        Dim csvFileName As String
        Dim TB As DataTable = ds.Tables.Add
        Dim dscol As DataColumn
    ★  TB.Columns.Add("項目", Type.GetType("System.String"))
    ★  TB.Columns.Add("値", Type.GetType("System.String"))

[ツリー表示へ]
タイトルRe^5: 文字が表示できない。
記事No11723
投稿日: 2016/08/17(Wed) 14:30
投稿者まりもん
調べ方は書かれていたように、Column.DataTypeで調べました。

>ちなみに下記プログラムのように★部分を追記して
>1列目、2列目をstring型にしてからデータテーブルにCSVファイルを読み込んだつもりなのですが、
>やはり表示されない状態でした。データを格納しているタイミングがわるいのか?良くわかりませんでした。
>先ほど記述したメッセージボックスのやつでデータ型を確認したらSTRING型だったんですがね。

もし、
  ★  TB.Columns.Add("項目", Type.GetType("System.String"))
    ★  TB.Columns.Add("値", Type.GetType("System.String"))
の後に
    Using cn As New System.Data.OleDb.OleDbConnection
            cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FolderPath &
                  ";Extended Properties=""Text;HDR=YES;IMEX=1;FMT=Delimited"""
            Using da As System.Data.OleDb.OleDbDataAdapter =
               New System.Data.OleDb.OleDbDataAdapter("SELECT * FROM " & csvFileName, cn)
                da.Fill(ds, "Table1")

            End Using
        End Using
を実行されたのであれば、ds.Tables(1)が出来ていたりしませんかね?



実現されたいことを実現するには、まずファイルフォーマットを決定すること
そして、決定したファイルフォーマット通りに読み込むようにすること。

例)1行目は現場名
  2行目は場所
  3行目は試験者
  4行目は日付
  5行目は試験体No
  6行目は空白行
  7行目以降はChartに表示するデータ

        Try
      Dim ReadLines As Integer = 0
            Using sr As New System.IO.StreamReader(TextBox1.Text, System.Text.Encoding.Default)
                'ファイルの最後までループ
                Do Until sr.Peek() = -1
                    Dim temp() As String
                    temp = Split(sr.ReadLine(), ",")
                    ReadLines += 1      '読み込んだ行数をカウント

                    Select Case ReadLines
                    Case 1
                        '1行目 現場名
            Genba = temp(1)
                    Case 2
                        '2行目 場所
            Basyo = temp(1)
                    Case 3
                        '3行目 試験者
                    Case 4
                        '4行目 日付
                    Case 5
                        '5行目 試験体No
                    Case 6
                        '6行目 空白行
                    Case Else
                        '7行目以降
                        TB.Rows.Add(Integer.Parse(temp(0)), _
                                    Single.Parse(temp(1)), _
                                    Single.Parse(temp(2)), _
                                    Date.Parse(temp(3)), _
                                    Integer.Parse(temp(4)))
                Loop
            End Using

      Chart1.DataSource = ds
                      ・
                      ・
                      ・
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try

のような感じで現場名等の部分はDataTableには入れないで完全に別々に処理すればよいのではないかと
思います。

[ツリー表示へ]
タイトルRe^6: 文字が表示できない。
記事No11725
投稿日: 2016/08/22(Mon) 11:53
投稿者耳たぶ黒
まりもんさん 返信ありがとうございます。
先週はバタバタしていてWEBを確認できていませんでした。すいません。
やはり、別々に処理した方が良いのですか?
一応、StreamReaderでコラムの形式をString形式にして読み込ませたら全部読み込めたました。
しかし、今度はグラフ等へデータ形式を変換してあげないと読み込まないようななので、
現状はAceプロバイダーを使ったデータテーブルをもう一つ用意してグラフ等に読み込ませています。
時間がなくて追い込まれてしまい、2テーブルを使っている状態なのです。

今後の取り組みとしてはなるべく1テーブルでできる様にする(自分の描いた通りになっていない。)
質問内容が被るかもしれませんが、データテーブルのデータ形式の途中変更は困難ですか?
例)
1行目〜11行目までは全column、string形式
11行目からラストまではcolumn(0):Integer,column(1):single,column(2):single,column(3):date

一応自分で試してみたのですが、形式は変更したのですが、読み込まれない状態でした。

グダグダ言わずにString形式で読み込めているのだからグラフやデータグリッドビューに格納する時、
データ形式を変更する方が良いのかもしれませんね。(スイマセン)

今は取りあえず、形にするだけで精一杯なので時間に余裕がある時に修正していこうと思ってます。
アドバイスありがとうございました。

[ツリー表示へ]
タイトルRe^7: 文字が表示できない。
記事No11727
投稿日: 2016/08/22(Mon) 17:18
投稿者まりもん
> 今後の取り組みとしてはなるべく1テーブルでできる様にする(自分の描いた通りになっていない。)
> 質問内容が被るかもしれませんが、データテーブルのデータ形式の途中変更は困難ですか?
> 例)
> 1行目〜11行目までは全column、string形式
> 11行目からラストまではcolumn(0):Integer,column(1):single,column(2):single,column(3):date

まず、例であげられているように途中の行からデータ型を変更することはできません。

   ┌──────┬──────┬──────┬──────┐
   │1列目Int  │2列目Int  │3列目Int  │4列目Date │
   ├──────┼──────┼──────┼──────┤
1行目│      │      │      │      │
   ├──────┼──────┼──────┼──────┤
2行目│      │      │      │      │
   ├──────┼──────┼──────┼──────┤
3行目│      │      │      │      │
   ├──────┼──────┼──────┼──────┤
4行目│      │      │      │      │
   ├──────┼──────┼──────┼──────┤

DataTableに格納できるのは、このような単純な表のみです。
今回やろうとしているのは


   現場名  ○○○○○○
   検査担当 ×× ××

                      検査日:2016/08/22
   ┌──────┬──────┬──────┬──────┐
   │1列目Int  │2列目Int  │3列目Int  │4列目Date │
   ├──────┼──────┼──────┼──────┤
1行目│      │      │      │      │
   ├──────┼──────┼──────┼──────┤
2行目│      │      │      │      │
   ├──────┼──────┼──────┼──────┤
3行目│      │      │      │      │
   ├──────┼──────┼──────┼──────┤
4行目│      │      │      │      │
   ├──────┼──────┼──────┼──────┤

みたいな物を格納しようとしていることになると思います。



   ┌───────────────────────────┐
   │      ┌───────┐            │
   │ 現場名  │       │            │
   │      └───────┘            │
   │      ┌───────┐            │
   │ 検査日  │       │            │
   │      └───────┘            │
   │ ┌───────────────────────┐ │
   │ │                       │ │
   │ │                       │ │
   │ │                       │ │
   │ │                       │ │
   │ │                       │ │
   │ │                       │ │
   │ │       Chartコントロール        │ │
   │ │                       │ │
   │ │                       │ │
   │ │                       │ │
   │ │                       │ │
   │ │                       │ │
   │ │                       │ │
   │ │                       │ │
   │ └───────────────────────┘ │
   └───────────────────────────┘


上記のような画面で別々に表現するか
http://hanatyan.sakura.ne.jp/vb2005/vb2013chart02.htm
のChart のグラフタイトルに関する設定みたいにTitleで設定する
ような形になるのではないかと思いますがいかがでしょうか?


[ツリー表示へ]
タイトルRe^8: 文字が表示できない。
記事No11728
投稿日: 2016/08/23(Tue) 14:09
投稿者耳たぶ黒
まりもんさん ありがとうございます。
やっぱり、データテーブルのデータ型は単純じゃないと駄目ですか〜。
じゃあ、いったんデータテーブルに全部String型で読み込んで、
チャートやデータグリッドビューにデータを格納する際にデータ型を変えるのが出来ればそっちの方が
いいかもしれないですね。(時間が無くてそこまで2、3回やって駄目だったんで挫折したまんまです)

[ツリー表示へ]