none
CSVファイルから取り込んだ小数値の扱いについて RRS feed

  • 質問

  • VB2003 .Netで開発中です。

     

    今、CSVファイルをStreamReaderでオープンし、ReadLineで1行ずつデータを取得して、

    その内容を取得しています。

     

    取得する際、次のような記述で取得しています。

    Dim oFile As New System.IO.StreamReader(tmpCsvFileName, System.Text.Encoding.GetEncoding(932))

    Dim sLine As String = oFile.ReadLine() 
    While (oFile.Peek <> -1 Or sLine <> "")
         'sLineをカンマで分解し、各セルの情報を取得する

        :

        sLine = oFile.ReadLine()
    End While

     

    ここで、sLineの中身を見てみると、実数値が0より大きく1未満の場合(例えば0.15)

    ”.15”として値がとられてしまっています。

     

    これを、0.15として取得するにはどうしたらよいのでしょうか。

    ちなみに、EXCELで確認したところ、セルの書式設定は標準です。

     

    EXCEL側での調整でも、プログラムからの調整でも構いません。

    しかし、セルには、場所によって”指数”設定がされているところがあり、

    取得した値を単純にVal関数等で変換すると、

    ".15" が"0.15"になるだけでなく、

    "1.12E+08"が"111639500"となってしまうので、

    この変換はしたくありません。

     

    アドバイスお願いいたします。

    2007年8月2日 9:50

すべての返信

  • きついことを言うようですが、

    全体像についての記述が無く、各段落が前後とつながりの無い事柄ばかりで想像するのも困難な情報量ですよ。

     

     msdn.bambino さんからの引用

    取得する際、次のような記述で取得しています。

    Dim oFile As New System.IO.StreamReader(tmpCsvFileName, System.Text.Encoding.GetEncoding(932))

    Dim sLine As String = oFile.ReadLine() 
    While (oFile.Peek <> -1 Or sLine <> "")
         'sLineをカンマで分解し、各セルの情報を取得する

        :

        sLine = oFile.ReadLine()
    End While

    単純なファイル読み込みループであることは理解できますが、ぽつんと「セル」という言葉がいきなり出てきます。

     

     msdn.bambino さんからの引用

    ここで、sLineの中身を見てみると、実数値が0より大きく1未満の場合(例えば0.15)

    ”.15”として値がとられてしまっています。

    sLineは読み込んだ一行の文字列です。メモ帳などで見たまんまのものが入っているはずですよね?

    なのに「とられてしまっています」と第三者が関与したかのような記述があります。

    つまり提示されたコードである限り、その疑問が出ること自体が疑問です。

     

     msdn.bambino さんからの引用

    これを、0.15として取得するにはどうしたらよいのでしょうか。

    前記同様、ファイルの中身が".15"であるなら".15"で正しいです。

     

     msdn.bambino さんからの引用

    ちなみに、EXCELで確認したところ、セルの書式設定は標準です。

    ここでいきなりExcel登場ですね。

    「Excelで見てみたら」かと思ったら、「Excelはこうなっている」という記述です。

    ということはExcelが処理に関わっているという想像がつくが、書かれてません。

     

     msdn.bambino さんからの引用

    EXCEL側での調整でも、プログラムからの調整でも構いません。

    Excelとプログラムの関係がわからない以上、誰もアドバイスできないと思います。

     

    仕様、再現手順、結果・状況、やってみたこと、をわかるように書かれたほうがよいでしょう。
    2007年8月3日 3:19
  • 外池と申します。

     

    ごくごく基本的なところで、数値(浮動小数点数)がパソコン内部でどのように格納されているか(記憶されているか)、誤解されていると思います。

     

    パソコン内部では、".15"も"0.15"も全く同じです。これは、Excelであっても、Visual Basicであっても同じことです。パソコン内部で同じように記憶されている数値を、表示する上で小数点の前のゼロを省略するか、省略せずに表示するか、プログラマーの選択次第です。したがいまして、「取得」の段階では、まったく気になさる必要はないと思います。

     

    "1.12E+08"と"111639500"ですが、実のところ、パソコンの内部では"111639500"というように有効数字はたくさん記憶されています。その上で、表示する際に指数表示を選んでやる(指数表示になるようにプログラムしてやる)わけですが、これはごくごく簡単です。上述の".15"か"0.15"かの、表示方法の選択と同程度の問題です。String.Formatメソッドなどの、数値を出力する際のフォーマットの記事を熟読してください。やはり「取得」の段階では、まったく気になさる必要はないと思います。

     

    それとも、もしかして、内部表現でも有効数字が3桁に丸め(有効数字を減らすこと)たいですか? これは、若干面倒です。

     

    ちなみに、Excelも、Excelシートの表示で表面的に見える数字の桁数より、ずっとたくさんの桁数が内部的に記憶されています。CSVファイル形式で書き出すときには、内部的な記憶が失われないように、Excelシートの表示よりも、ずっと細かくたくさんの桁数が出力されることがあります。

    2007年8月4日 4:32
  • 説明が足らず、また、勉強不足で大変申し訳ありません。

     

    御指摘頂いたように、メモ帳でファイルを開くと".15"という状態で入っていました。

    エクセルで表示したところ、"0.15"と表示してあったため、

    ファイルの内容として"0.15"と入っているものとばかり思っていました。

    基本的な所を見落としていました。

     

    上記の点を踏まえますと、

    やりたかった事は、実は単純でして、

    ファイルを読み込んで、画面にデータを表示する際、

    ".15"と書かれているデータを”0.15”と表示したいということでした。

     

    画面表示時に変更するように変換の仕組みを入れて見ます。

     

    アドバイスありがとうございました。

    2007年8月7日 3:06