CSV出力のプログラムでデータが見れない問題の解決方法

このQ&Aのポイント
  • CSV出力のプログラムを作成しているが、ファイルを開いてもデータの中身が見れない問題が発生している。メモ帳で開くとデータは存在することが確認できる。記述内容を確認し、原因を特定してください。
  • CSV出力のプログラムを作成しているが、ファイルを開いてもデータの中身が空である問題が発生している。メモ帳で開くとデータは存在することが確認できる。どこに問題があるか教えてください。
  • CSV出力のプログラムを作成しているが、ファイルを開いてもデータが表示されない問題が発生している。メモ帳で開くとデータは存在することが確認できる。問題の原因と解決方法を教えてください。
回答を見る
  • ベストアンサー

CSV出力に関して

開発環境:Visual Basic 2008 教えて下さい。 あるホームページを参考に、CSV出力のプログラム(下記)を作成していますが、その際に、 どうやらデータは出力されているももの、ファイルを開いてもデータの中身が見れません。 メモ帳で開くとデータは存在しています。 何か記述漏れ等ありますでしょうか? 初歩的なトラブルで申し訳ありませんが、教えて下さい。 よろしくお願いします。 《記述内容》 Dim dt As DataTable = CType(G_DATA.DataSource, DataTable) '保存先のCSVファイルのパス Dim csvPath As String = "C:\test1.csv" 'CSVファイルに書き込むときに使うEncoding Dim enc As System.Text.Encoding = _ System.Text.Encoding.GetEncoding("Shift_JIS") '開く Dim sr As New System.IO.StreamWriter(csvPath, False, enc) Dim colCount As Integer = dt.Columns.Count Dim lastColIndex As Integer = colCount - 1 'ヘッダを書き込む Dim i As Integer For i = 0 To colCount - 1 'ヘッダの取得 Dim field As String = dt.Columns(i).Caption '"で囲む必要があるか調べる If field.IndexOf(ControlChars.Quote) > -1 OrElse _ field.IndexOf(","c) > -1 OrElse _ field.IndexOf(ControlChars.Cr) > -1 OrElse _ field.IndexOf(ControlChars.Lf) > -1 OrElse _ field.StartsWith(" ") OrElse _ field.StartsWith(ControlChars.Tab) OrElse _ field.EndsWith(" ") OrElse _ field.EndsWith(ControlChars.Tab) Then If field.IndexOf(ControlChars.Quote) > -1 Then '"を""とする field = field.Replace("""", """""") End If field = """" + field + """" End If 'フィールドを書き込む sr.Write(field) 'カンマを書き込む If lastColIndex > i Then sr.Write(","c) End If Next i '改行する sr.Write(ControlChars.Cr + ControlChars.Lf) 'レコードを書き込む Dim row As DataRow For Each row In dt.Rows For i = 0 To colCount - 1 'フィールドの取得 Dim field As String = row(i).ToString() '"で囲む必要があるか調べる If field.IndexOf(ControlChars.Quote) > -1 OrElse _ field.IndexOf(","c) > -1 OrElse _ field.IndexOf(ControlChars.Cr) > -1 OrElse _ field.IndexOf(ControlChars.Lf) > -1 OrElse _ field.StartsWith(" ") OrElse _ field.StartsWith(ControlChars.Tab) OrElse _ field.EndsWith(" ") OrElse _ field.EndsWith(ControlChars.Tab) Then If field.IndexOf(ControlChars.Quote) > -1 Then '"を""とする field = field.Replace("""", """""") End If field = """" + field + """" End If 'フィールドを書き込む sr.Write(field) 'カンマを書き込む If lastColIndex > i Then sr.Write(","c) End If Next i '改行する sr.Write(ControlChars.Cr + ControlChars.Lf) Next row '閉じる sr.Close()

質問者が選んだベストアンサー

  • ベストアンサー
noname#259269
noname#259269
回答No.2

メモ帳で開いて、出力データが記録されているのが確認できたなら、テストとしては完了のはずでは? ファイルの書き込みが終わっていないうちに開こうとしているとか? sr.Close の前に sr.Flush とかやってもダメですか?

asamix_000
質問者

お礼

edp3142様、ご回答ありがとうございます。 ご指摘の通り、sr.Flushを記述したところ、正しく表示されました。 書き込みが終わっていなかったのですね、、、 本当にありがとうございました!

その他の回答 (2)

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.3

> CSVファイルをダブルクリックした際に、中身のデータが見えないという事です。 メモ帳で見えているならCSVファイルは出来ています。 あなたが何のAPをCSVファイルに関連付けているのか解りませんが、もしExcelで開けないと言うことでしたら、単にExcelの設定の問題である可能性があります。 オプション→詳細設定→全般→「Dynamic Data Exchange (DDE) を使用する他のアプリケーションを無視する」のチェックを外してみて下さい。 #Excel2007の場合(ほかのバージョンは適当に調べて下さい)

  • STICKY2006
  • ベストアンサー率29% (1536/5269)
回答No.1

こんちは。 プログラム読むのはかったるいので読みません。。。あしからず。。。 >>どうやらデータは出力されているももの、ファイルを開いてもデータの中身が見れません。 >>メモ帳で開くとデータは存在しています。 どういう意味ですか??? データは出力されていてデータの中身は無いけれどもメモ帳で開くとデータはある。 ん??? ファイルは存在するんですよね。 test1.csv 中身はどうなってるんですか? 見た感じ、カンマ区切りCSVですよね? メモ帳で開いた際に、 項目名1,項目名2,項目名3,項目名4,項目名5 ああああ,いいいい,うううう,ええええ,おおおお かかかか,きききき,くくくく,けけけけ,ここここ ささささ,しししし,すすすす,せせせせ,そそそそ って感じのが望まれる結果だと思うのですが データは出力されてるけどメモ帳で開いて中身がない? イマイチ良くわからないです。 ファイルはあるけど中身がない。 ってだけなら、ファイル作成処理のところは問題ないことになるので、 項目のデータ取得するところ、もしくは、データをファイル内に書き込む箇所 がおかしいんでしょうね。 その辺にあたりをつけてデバックされるといいでしょう。

asamix_000
質問者

お礼

STICKY2006様、ご回答ありがとうございます。 わかりにくい内容で申し訳ありません。 不思議な現象で、、、、 test1.csvというファイルは最初からマスターファイルのような活用する為に存在し、 そこへデータを書き込むというような作りをしています。 処理を実行させると、エラーも出ず正しく終了され、test1.csvのデータサイズも増えて いる為、データは出力されているだろうとは思われますが、いざ実際にファイルを開くと データが書き込まれていません、、、 但し、データサイズが増えている為、書き込まれているんじゃないかと思い、メモ帳で 開くとおっしゃる通り、 項目名1,項目名2,項目名3,項目名4,項目名5 ああああ,いいいい,うううう,ええええ,おおおお かかかか,きききき,くくくく,けけけけ,ここここ ささささ,しししし,すすすす,せせせせ,そそそそ と出力されています。 CSVファイルをダブルクリックした際に、中身のデータが見えないという事です。 エラーも何も起きず、デバックも問題ない為、何がおかしいのか掴めず、、、

関連するQ&A

  • datagridviewの行の追加と削除について

    VB2010を使用しています(初心者です) あるCSVファイルをDatagridviewにデータバインドしたあと『Rows.Add』でデータ追加をしようとするとエラーが出たので下記のようなコードでCSVを上書きして再読み込みしてうまくいったのですがRemoveAt()などで行削除した後にコードを走らせると『削除された行を通して、その行の情報にアクセスすることはできません。』とエラーが出ます いろいろ試したのですが結果はかわらずでした。 どのようにすればエラー回避できるでしょうか?ご教授お願いします。 Dim Row As DataRow For Each Row In DT.Rows For i = 0 To ColCount - 1 Dim Field As String = Row(i).ToString()   ←ここでエラーが出ます If Field.IndexOf(ControlChars.Quote) > -1 OrElse _ Field.IndexOf(","c) > -1 OrElse _ Field.IndexOf(ControlChars.Cr) > -1 OrElse _ Field.IndexOf(ControlChars.Lf) > -1 OrElse _ Field.StartsWith(" ") OrElse _ Field.StartsWith(ControlChars.Tab) OrElse _ Field.EndsWith(" ") OrElse _ Field.EndsWith(ControlChars.Tab) Then If Field.IndexOf(ControlChars.Quote) > -1 Then Field = Field.Replace("""", """""") End If Field = """" + Field + """" End If SR.Write(Field) If LastColIndex > i Then SR.Write(","c) End If Next i SR.Write(ControlChars.Cr + ControlChars.Lf) Next Row Dim CSVSTR As String = Me.Text1.Text & "," & Me.Combo1.Text & "," & Me.Combo2.Text & "," & Me.Text2.Text & "," & Text3.Text & ",Data" SR.Write(CSVSTR) SR.Close() Call CSV取込()

  • サブフォームでフィルタしたデータのCSV出力

    ACCESS2007 で テーブル  T_リスト name      cate aaa       123 sss       543 rtyy      45t4 フォーム 顧客があり リスト作成ボタンがあります フォーム顧客の中に フォーム電話帳サブフォームがあり データソースはT_リストです その都度手動でフィルタをかける作業をします リスト作成ボタンを押すとフィルタで抽出したデータだけを CSVに書き出したいと思っています。 下記実行しましたが、 T_リストの一行目のデータしか書き出しません DoCmd.OpenForm ("電話帳サブフォーム")でフォームを出さずに実行したいです どなたかよいアドバイスをお願いします。 Private Sub コマンド1_Click() Dim F As Variant Dim Field1 As String Dim Field2 As String Dim M As Double Dim i As Double Field1 = "name" Field2 = "cat1" M = Me![電話帳サブフォーム].Form.Recordset.RecordCount Open "C:\ListMaker\out.csv" For Output As #1 Write #1, Field1, Field2 DoCmd.OpenForm ("電話帳サブフォーム") Me.[電話帳サブフォーム].SetFocus For i = 1 To M DoCmd.GoToRecord acDataForm, "Me.電話帳サブフォーム", acGoTo, i Write #1, Me![電話帳サブフォーム]![name] i = i + 1 Next DoCmd.GoToRecord , , acFirst Close #1 End Sub

  • ACCESSのCSV出力に関して

    教えて下さい。 ACCESSであるテーブルのデータをCSV出力しようとして、以下のような記述をしました。 結果、問題なく出力されましたが、データだけでなく、項目も出力しようと考えています。 その際にはどのような記述をすれば良いでしょうか? 初歩的な質問で申し訳ありません。 教えて下さい。 《内容》 Dim cnn As ADODB.Connection Dim rst As ADODB.Recordset Dim stSQL As String Dim stTBL As String Dim myWSH As Object 'WScript Dim myDesktopPath As String Dim stPath As String 'フルパス Dim objFSO As Object 'FileSystemObject Dim fsoTS As Object 'TextStream Dim tmp As Variant 'データ Dim re As Variant 'データ件数 Dim stDocName As String Const ForAppending = 8 stTBL = "t_合算" 'テーブル名 '開始メッセージ stDocName = "「" & stTBL & ".CSV」 ファイルをデスクトップに作成します" If MsgBox(stDocName, vbYesNo) = vbNo Then Exit Sub 'デスクトップパス取得 Set myWSH = CreateObject("WScript.Shell") myDesktopPath = myWSH.SpecialFolders("Desktop") Set myWSH = Nothing 'フルパス stPath = myDesktopPath & "\" & stTBL & ".CSV" '読み取り専用でセット Set cnn = CurrentProject.Connection stSQL = "SELECT * FROM " & stTBL Set rst = cnn.Execute(stSQL) If rst.EOF Then stDocName = "出力するデータがありませんでした" Else '文字列データ格納 (全データ出力、カンマ区切り) tmp = rst.GetString(adClipString, , ",", vbNewLine) '出力 Set objFSO = CreateObject("Scripting.FileSystemObject") With objFSO If .FileExists(stPath) Then '既存ファイル削除 Call .DeleteFile(stPath) End If Set fsoTS = .OpenTextFile(stPath, ForAppending, True) '文字列一括書き出し fsoTS.WriteLine tmp re = fsoTS.Line - 2 End With Set fsoTS = Nothing: Set objFSO = Nothing stDocName = re & " 件の CSVデータを出力しました。" End If MsgBox stDocName, vbOKOnly

  • 素数を求めるマクロを

    走らすと暴走したようになり、素数=151で止まります。 どこが悪いのでしょうか。正常に終わるようにしたいです。 ====================== Sub 素数を求める()   Dim i As Long   Dim j As Long   Dim m As Long   Dim p As Long   Dim flg As Boolean   i = 1   j = 1   p = 2   Do     flg = False     For m = 2 To Int(Sqr(p))       If p Mod m = 0 Then         flg = True         Exit For       End If     Next     If flg = False Then       Cells(i, j) = p       i = i + 1       If i > Rows.Count Then         i = 1         j = j + 1       End If     End If     p = p + 1   Loop End Sub ======================

  • 配列のセットの仕方

    度々質問してすいません。 英文の単語を抽出して頻度順に並べるプログラムをVBで作りたいと思っております。下記URLのVB版です。 (http://gamp.c.u-tokyo.ac.jp/archive/perl.htm) 以下が作成したソースです。これとQuickSortのソース(http://www.geocities.co.jp/SilkRoad/4511/vb/sort.htm) を繋げて終わりたいと思うのですが、 どうつなげたらいいのかわかりません。 アドバイスをお願いいたします。 Private Sub Command1_Click() Dim strTarget As String Dim strResult As String Dim cha As String Dim chaList() As String Dim word As String Dim wordList() As Long Dim i As Long, j As Long Dim EndFlg As String strTarget = Me.Text1.Text i = 0 EndFlg = "" Do Until EndFlg = "END" i = i + 1 cha = Mid(strTarget, i, 1) If cha <> "" Then ReDim Preserve chaList(i) chaList(i - 1) = cha Else EndFlg = "END" End If Loop For i = 0 To UBound(chaList) - 1 If chaList(i) = "." Then chaList(i) = " " End If Next Text2 = "" For i = 0 To UBound(chaList) - 1 Text2 = Text2 & chaList(i) Next Text3 = "" word = "" For i = 0 To UBound(chaList) - 1 If chaList(i) = " " Then If i = 0 Then Else If chaList(i - 1) = " " Then Else Text3 = Text3 & Chr(13) & Chr(10) & word word = "" End If End If Else word = word & chaList(i) End If Next If word <> "" Then Text3 = Text3 & Chr(13) & Chr(10) & word End If

  • VBAで、ExcelシートにCSVファイルのデータを取り込みたいのです

    VBAで、ExcelシートにCSVファイルのデータを取り込みたいのですが、 1行目しか取り込めません。 取り込む項目数は32個です。 以下のコードでは、Excelシートの1行目のみ取り込みができますが、 1行目32列目のセルには、2行目のA列に表示されるべきデータも表示されます。 2行目以下は取り込みできていません。 Sub CSV取込() Dim OpenFileName As String Dim MyString As String Dim MyVar As Variant Dim i As Long, j As Long OpenFileName = Application.GetOpenFilename("CSVファイル,*.csv") If OpenFileName = "False" Then MsgBox "キャンセルされました。" Else Open OpenFileName For Input Access Read As #1 i = 1 While Not EOF(1) Line Input #1, MyString MyVar = Split(MyString, ",") If MyVar(0) <> "" Then For j = 0 To 31 ThisWorkbook.ActiveSheet.Cells(i + 10, j + 1) = MyVar(j) Next j i = i + 1 End If Wend Close #1 End If End Sub おそらく、改行が判別できないためかと思いますが、 どこが間違っているのかがわかりません。 アドバイスをよろしくお願いします。

  • ACCESS VBA でのCSV取込エラー

    ACCESS VBA でのCSV取込エラー ACCESSにてフォルダ内にあるCSVファイルをすべてインポートしようとしています。 インポート定義を作成して、下記のコードを書いてみましたが、 データはすべてインポートされるのですが、 カンマが無視され、フィールドとフィールドの中間で途切れてデータが格納されてしまいます。 またフィールド4は日付形式なのですがこれがインポートエラーになります。 フィールド1 フィールド2 フィールド3 フィールド4 aaa aa,bbb bbb,ccc  エラー 2日間ほどネットサーフィンをして調べたのですが、 回避方法が見つからなかったので、お知恵を拝借できますでしょうか? よろしくお願いいたします。 Private Sub cmd06_Click() Dim MyFile As String Dim MyName As String Dim strFolderName As String DoCmd.SetWarnings False DoCmd.OpenQuery "Q09_全CSVデータ削除" DoCmd.SetWarnings True strFolderName = GetFolderName() 'フォルダ選択ダイアログを表示 If Len(strFolderName) > 0 Then '選択結果を評価 MyFile = strFolderName & "\*.csv" '【拡張子csvのファイルのみ取得】 MyName = Dir(MyFile, vbNormal) Do While MyName <> "" If MyName <> "." And MyName <> ".." Then If GetAttr(strFolderName & "\" & MyName) <> vbDirectory Then DoCmd.TransferText acImportFixed, "インポート定義", "T03_全CSVデータ", strFolderName & "\" & MyName, False, "" '【取得したファイルをインポート】 End If End If MyName = Dir Loop Else MsgBox "フォルダは選択されませんでした" End If MsgBox "データのインポートが終了しました" End Sub

  • 符号付きの係数の出力(散布図近似式)

    QNo.4257168 にて質問したものです。 図の中で表現されている5次の式の係数(6個あります)を セルの中に書き出すマクロに関して 下記のコードを教えて頂いたのですが、係数は数字のみ出力され、-の符号は出力されません。どのようにしたら符号付きの係数の出力が可能になるでしょうか。(大変簡潔なコードで感心しています) Sub test()   Dim str As String   Dim strv As Variant   Dim i As Integer   str = "y = 0.0452x5 - 8.6275x4 + 658.58x3 - 25133x2 + 4795.20x - 4E+0.6"   strv = Split(str, " ")   For i = 0 To UBound(strv)     If strv(i) Like "*E+*" Then       MsgBox strv(i)     Else       If Val(strv(i)) > 0 Then         MsgBox Val(strv(i))       End If     End If   Next i

  • CSVファイルの読み込みVBA作成について

    初めまして。 色々インターネット等で検索して作成してみたのですが、 ここから先のプログラムが組めないので、 やり方を教えて頂けますと幸いです。 おそらくIf Elseで場合訳すると思うのですが、 上手くできてません。 下記、プログラムの概要です。 (1)フォルダを指定し、そのフォルダにある全てのCSVファイルを読み込む。 (2)CSVファイルを読み込む際には、「*.csv」の「*」部分をワークシート名とし、CSVファイルの内容をワークシートに書き込む。 例)「test.csv」の場合、ワークシート名は「test」になります。 (3)既にブックにワークシート名がある場合は上書き処理を行い、ない場合は新規に作成する。 例)既に「test」ワークシートがある場合は、内容の上書きを行います。 (4)ワークシートを追加する際は、今あるワークシートの最後に追加する。 下記に現在作ったプログラムを記載します --------------------------------- Sub csvRead() Dim FoldPath As String Dim f Dim ch1 As Long Dim r As Long Dim textLine As String Dim csvLine() As String Dim i As Long Dim FSO Dim folderSelect As Object Set folderSelect = CreateObject("Shell.Application"). _ BrowseForFolder(0, "フォルダを選択してください", 0) If Not folderSelect Is Nothing Then FoldPath = folderSelect.Self.Path 'フォルダ選択 End If Set FSO = CreateObject("Scripting.FileSystemObject") i = Worksheets.Count '現在のワークシート数を格納 For Each f In FSO.GetFolder(FoldPath).Files If StrConv(Right(f.Path, 4), vbLowerCase) = ".csv" Then ch1 = FreeFile Open f.Path For Input As #ch1 r = 1 Worksheets.Add after:=Worksheets(i) With ActiveSheet .Name = Left(f.Name, Len(f.Name) - 4) Do While Not EOF(ch1) Line Input #ch1, textLine If textLine <> "" Then csvLine() = Split(textLine, ",") .Range(Cells(r, 1), Cells(r, UBound(csvLine()) + 1)) = csvLine() End If r = r + 1 Loop End With i = i + 1 Close #ch1 End If Next End Sub

  • セルの値から任意の文字のみを抽出する

    こんにちは。 VBA勉強中です。 どうしても詰まってしまったので力を貸してください。・゜・(ノД`)・゜・。 Sheet1にはA列~J列にデータが入っています(行数は3行目~□行目・・・都度変わります) Sheet2には抽出したい文字の一覧(仮に禁止ワードとします)がB列5行目~○行目まで入ってます。 質問としてはSheet1のB列、D列、F列のそれぞれの値より禁止ワードを抽出する。 1つのセルに禁止ワードが0~最大5つ入っている時にK列から→方向に禁止ワードを並べて行くといった 感じです。 わかりにくくてすみませんが宜しくお願い致します。 以下自分で考えてみたコードです。。 これだと始めのB列のみ抽出に成功しましたがその他の列からは抽出できず・・・。゜(PД`q。)゜。 列Bで使用したコードをD列、F列にも使えると下に数値のみ変えて羅列しただけだからでしょうか;w; 本当に初心者ですみません。。 以下コードです。 Sub 禁止ワード抽出() Dim SR As Integer , LR As Integer, SR2 As Integer , LR2 As Integer , LR3 As Integer , LR4 As Integer Dim i As Long , j As Long , k As Long , m As Long Dim KINSHI As Variant SR = 3 SR2 =5 LR = Sheets("Sheet1").Range("B" Rows.Count).End(xlUp).Row LR2 = Sheets("Sheet1").Range("D" Rows.Count).End(xlUp).Row LR3 = Sheets("Sheet1").Range("F" Rows.Count).End(xlUp).Row LR4 = Sheets("Sheet2").Range("B" Rows.Count).End(xlUp).Row For j = SR2 To LR4 KINSHI = Sheets("Sheet2").Cells(j , 2).Value For i = SR To LR If Sheets(Sheet1).Cells(i , 2).Value Like ("*" & KINSHI & "*") Then If Cells(i , 10) = "" Then Cells(i , 10) = KINSHI Else   If Cells(i , 10 + 1) = "" Then Cells(i , 10 + 1) = KINSHI            Else   If Cells(i , 10 + 2) = "" Then Cells(i , 10 + 2) = KINSHI Else   If Cells(i , 10 + 3) = "" Then Cells(i , 10 + 3) = KINSHI Else   If Cells(i , 10 + 4) = "" Then Cells(i , 10 + 4) = KINSHI End If End If End If End If End If End If Next i , j 以下上記コードをD列、F列バージョンで並べています・・・・ End Sub 恐らくOffsetプロパティを使う方がいいと思いましたが中々うまくいかず 自分なりに色々考えてみてこんな残念な結果になってしまいましたが 皆様のお力添えどうぞ宜しくお願い致します。