CSVファイルの作成方法に関して

解決


misamisa  2012-08-22 13:25:09  No: 103341  IP: [192.*.*.*]

開発環境:VB2008

あるホームページを参考に、以下のような記述をし、CSVファイルを作成するような
プログラムを作成しています。

また、CSVは何度も作成される為、一旦、削除してから作り直すというような事をしたい
と考えています。

削除の記述はわかるものの、新しくCSVファイル作成するには、以下の記述をどのように
修正すれば良いでしょうか、、、

教えて下さい。

よろしくお願いいます。

《記述内容》

'保存先のCSVファイルのパス
Dim csvPath As String = "C:\TEST.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 = dtTable.Columns.Count
Dim lastColIndex As Integer = colCount - 1

'ヘッダを書き込む
Dim i As Integer
For i = 0 To colCount - 1
    'ヘッダの取得
    Dim field As String = dtTable.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 dtTable.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.Flush()
sr.Close()

編集 削除
魔界の仮面弁士  2012-08-22 16:51:06  No: 103342  IP: [192.*.*.*]

> 開発環境:VB2008
ここは VB2-VB6専用の掲示板です。
VB.NET は、お隣の掲示板にお願いします。


> あるホームページを参考に、
引用元の URL も示したほうが良いですよ。


> 削除の記述はわかるものの、新しくCSVファイル作成するには、以下の記述をどのように
> 修正すれば良いでしょうか、、、
> Dim sr As New System.IO.StreamWriter(csvPath, False, enc)
第二引数に False を指定していますよね。
この場合、元のファイルの有無に関わらず、常に新規作成(上書き)になりますよ。

ちなみに True の場合は、既存ファイルの末尾にデータ追加(ファイルが無ければ新規作成)です。

> '改行する
> sr.Write(ControlChars.Cr + ControlChars.Lf)
ControlChars.CrLf を使いましょう。

また、文字列連結は「+」よりも「&」を使う方が望ましいです。

編集 削除
misamisa  2012-08-22 17:42:55  No: 103343  IP: [192.*.*.*]

魔界の仮面弁士様、いつもご回答ありがとうございます。

申し訳ありません、掲載する場所を間違えていたようですね、、、

私の記述した内容では、もともとあるCSVファイルに上書きするだけなんですね、、、

とした場合、1回削除してから新規でファイルを作成し、そこへ書き込むという場合は
どのようにしたら良いのでしょうか、、、

本来は新規なので問題ないはずですが、、、

とういのも、私のプログラムがおかしいのですが、なぜかデータを更新しても、そのデータ
が反映されずにCSV出力されてしまい、画面を再起動してから実行すると出力されるという
おかしな事象が発生している為、上記のような事ができないかと考えております。


よろしくお願いします。

編集 削除
魔界の仮面弁士  2012-08-22 19:24:26  No: 103344  IP: [192.*.*.*]

> よろしくお願いします。
よろしくではなく移動をお願いします。
繰り返しになりますが、ここは VB.NET 用の掲示板ではありませんよ。


> 1回削除してから新規でファイルを作成し、そこへ書き込むという場合は
上書きモードだと何か都合が悪いのでしょうか?

> どのようにしたら良いのでしょうか、、、
「削除の記述はわかる」のでしたよね?
ファイルを削除したあとに、まったく同じ処理を記述するだけのはずですが…。

> そのデータが反映されずにCSV出力されてしまい
dtTable の内容が、「反映されたデータ」になっているかどうかを確認されましたか?
ここが古い情報だと、CSV の内容も古いままの筈ですよ。

編集 削除
misamisa  2012-08-27 08:55:02  No: 103345  IP: [192.*.*.*]

VB.NETへ移動しました。

編集 削除