CSV吐き出し時に数値の末尾が0になる件


コアラ  2004-08-05 03:58:44  No: 115369

お世話になっています。
VB6.0+JET4.0で簡単なアプリケーションを作成しています。

CSVにSQLで取得したレコードセットの内容を吐かせているのですが、
数値の末尾が"0"になってしまう項目があります。

DBにはちゃんと末尾には0以外のデータも格納されているのに
CSVに吐くと末尾だけ0になってしまいます。
15桁ある数値項目にだけこの現象がおこっているようです。(他は大丈夫でした)

要因は何でしょうか?
また解決策はございますでしょうか?


コアラ  2004-08-05 04:38:21  No: 115370

質問したものです。
よくよく検証してみると、
EXCELでこのcsvを閲覧した際にのみ、この現象がおこっているようです。
テキストエディタでオープンすると問題ありませんでした。

う〜む。VB側ではどうしもようもないのか。。。


ささ  2004-08-05 06:25:24  No: 115371

>>要因は何でしょうか?
エクセルが勝手に編集を行っている。

>>また解決策はございますでしょうか?
そもそも、CSVファイルをExcelで見たときに・・・。
という考え方をどうにかしないといけないと思います。
CSVの最後が,,,,,,,,,,,,,,というようにすべてNULLなどのファイルを開いて、何もせずにCSV保存した後に、テキストエディタで開いてみてください。
あぁ〜、excelのCSV管理ってこの程度なんだと良くわかります。

>>う〜む。VB側ではどうしもようもないのか。。。
VB側というより、Excelの問題です。データは正しいのならば・・・。


いな  2004-08-05 06:35:40  No: 115372

>>EXCELでこのcsvを閲覧した際にのみ、この現象がおこっているようです。

デジタルデータとしてCSVファイルが、正しく出力されているのであるならば、

あとは、CSVファイルを読み込むアプリが編集を行っている
と思うの正常な考え方です。

CSVを出力し、EXCELで表示させる必要がある仕様の場合、
数値項目も文字列として扱って出力する。等の方法もあります。
が、個人的にCSVファイルを除いてみたという程度ならば、
そのまま捨て置くことです。

さささんの言うと降り、CSVファイルをエクセルで開いて編集というのは
プログラマ的にはNGと思います。


コアラ  2004-08-06 17:31:24  No: 115373

さささん  いなさん

ありがとうございます。お二人のおっしゃるとおりでございます。

>CSVを出力し、EXCELで表示させる必要がある仕様の場合、
>数値項目も文字列として扱って出力する。等の方法もあります

ただ、この方法をお教えいただけないでしょうか。
どうしてもcsvをEXCELで加工する必要があるようで、
このまま捨て置くわけにもいかず、弱ってます。。。
以下に現状のソースを記載いたします。
何卒、ご教授いただきますようお願いいたします。

Private Sub Command1_Click()

'csv出力
  Dim s3cn_ado
  Dim dsn As String
  Dim sql As String
  Dim fnm As String
  Dim mds As Boolean
  Dim RS As Variant
  Dim fno As Integer
  Dim rec As String
  Dim i As Integer
  Dim dummy As Variant
  Dim s As String
  Dim FNOW As String

  Set RS = Nothing
   
  FNOW = Format(Now, "YYYYMMDD")

  dsn = cn
  
 'SQL
  sql = "select * from TBLJIO"
  fnm = "I:\Report\レポート" & FNOW & ".csv"
  mds = True

'Commandオブジェクトを作成
Set cmdMaster = New ADODB.Command
cmdMaster.ActiveConnection = cn
cmdMaster.CommandText = sql

'実行
Set RS = New ADODB.Recordset
Set RS = cmdMaster.Execute

'CSVに加工
  fno = FreeFile
  Open fnm For Output As fno Len = 32000
  If mds Then
    For i = 0 To RS.Fields.Count - 1
      rec = rec & Chr(&H22) & RS(i).Name & Chr(&H22) & ","
    Next
    Print #fno, Left(rec, Len(rec) - 1)
  End If
  Do Until RS.EOF
    rec = ""
    For i = 0 To RS.Fields.Count - 1
      dummy = RS(i)
      If IsNull(dummy) Then
        s = ""
      Else
        s = dummy
      End If
      rec = rec & Chr(&H22) & RTrim(s) & Chr(&H22) & ","
    Next
    Print #fno, Left(rec, Len(rec) - 1)
    RS.movenext
  Loop
  Close fno
  RS.Close
  
  Set RS = Nothing
  Unload Me
 
End Sub


いな  2004-08-06 20:55:41  No: 115374

出力した結果に対し
"(=ダブルクオーテーション)でくくると、
CSV的には囲まれたフィールドを一つの項目として認識します。

〜〜〜,"123,456,789,012,345","345",〜〜〜略
CSVの項目として,(=カンマ)も利用できます。

ただし、ささ さんの指摘の通り、
最後に何も項目が入っていない項目があると、
,,,,,,,を,"","","","","","","","","","",と出力しても
Excelから保存した場合、
これらの項目はカットしてしまう(=うまく変換できない)ので
最後にダミーの内容を入れ、強制的に書き出す方法が必要かと思います。

例えば
,,,,,,,を,"","","","","","","","","","",と出力するのではなく
,,,,,,,を,"","","","","","","","","","","Dummy"と出力する等

でも、こうゆうケースがありうるのならば・・・。ですが


ささ  2004-08-07 01:02:05  No: 115375

いなさん 

Chr(&H22)は ダブルコーテーションですよ


コアラ  2004-08-20 19:54:31  No: 115376

皆様ありがとうございます。
なんとか、EXCELで開いた際に数字の末尾が0に置き換わるのを
防ぐプログラムはないでしょうか?
CSV吐き出す際になんとかしたいのですが。(VB側で)

すいませんが、何卒お願いいたします。


魔界の仮面弁士  2004-08-20 20:28:18  No: 115377

csvをダブルクリックしてExcelで開くのではなく、Excelを起動してから、
[データ]-[外部データの取り込み]を使って読み込むよう、運用で回避しては如何でしょう。

csvデータには「書式」情報が無いため、ダブルクリックでのExcel起動では、
"00001"という文字列が「1」という数値に置き換わるなどの弊害がありますが、
外部データの取込であれば、ウィザードで書式を指定できるので、
データを正しく読み込む事ができます。

# ダブルクリックでの起動だと、A1セルに「ID」と書かれた.csvを、
# .slkと誤認してしまうという問題もありますし。

> CSV吐き出す際になんとかしたいのですが。(VB側で)
Excel側の見た目を優先するのですか?
CSVなら、データを優先した方が良いと思いますが。。。

もし、どうしても「ダブルクリックで起動したい」「Excelでの見た目を整えたい」
という事であれば、それらのデータを、

"=""1234567890""","=""123456789012345678901234567890"""
"=""1234567890""","=""123456789012345678901234567890"""
"=""1234567890""","=""123456789012345678901234567890"""

のように吐き出す、という手があります。
この場合、「="1234…"」という「文字列を返す数式」として認識されるので、
見た目上の桁落ちを無くす事ができるかと。

# もし、CSV形式に拘らないのであれば、書式付き(SYLKファイル等)の
# Excelデータとして吐き出すのも手かと。


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加