2013年12月16日月曜日

[VB.NET]CSVやTXTをそのまま取込むバッチに汎用性を持たせる。


使いまわせそうなのでメモ。文字化け対策もやった。(こっちの方が重要かも)
取込先のテーブル情報を先に読んでからセット。


Dim objSR As New StreamReader(strFilePath, Encoding.GetEncoding("shift-jis"))
Dim Strtbl As String = "[取り込みテーブル名]"
'テーブルの項目名をとっておく。
Dim DS As New DataSet
Std.ADONET.FillDataset(objTR, DS, "test", & _
 "SELECT name,type_name(user_type_id) AS kata FROM Sys.Columns WHERE object_id = object_id('" & strtbl & "') ")
If DS.Tables("test").Rows.Count = 0 Then
Throw New Exception("ERR:テーブル項目がありません。エラーが発生しました。")
End If


While (objSR.Peek() >= 0)
Dim strSQL As New System.Text.StringBuilder
Dim stBuffer As String = objSR.ReadLine()
'1列ずつ中身読込
If InStr(stBuffer, ",") = 0 Then
   Exit While
End If
Nakami = Split(stBuffer, ",")
'項目数がなにかの理由で(主に文字化け)合わない時
If Nakami.length - 1 <> DS.Tables("test").Rows.Count Then
Throw New Exception(cnt + 1 & "行:ERR:元データの項目数がおかしい。エラーが発生しました。")
End If
With DS.Tables("test")
strSQL.Append("INSERT INTO " & strtbl & _
                  " ( ")
                  For i As Integer = 0 To .Rows.Count - 1
                       strSQL.Append("[" & .Rows(i).Item("name") & "]")
                       If i <> .Rows.Count - 1 Then strSQL.Append(",")
                  Next
                  strSQL.Append(")")
                  strSQL.Append(" VALUES ")
                  strSQL.Append("(")
                  For k As Integer = 0 To .Rows.Count - 1
                      If .Rows(k).Item("kata") = "varchar" Then
                                '文字化け対策やってみる
                                If AscW(Nakami(k)) = 0 Then
                                    Messagebox.show( .Rows(k).Item("name") & "[" & Nakami(k).ToString & "]が文字化けしていたようなのでスペースに置き換えました。")
                                    Nakami(k) = ""
                                End If
                                strSQL.Append("'" & Nakami(k).ToString & "'")
                          Else
                                '文字化け対策やってみる
                                If AscW(Nakami(k)) = 0 Then
                                    Messagebox.show(.Rows(k).Item("name") & "[" & Nakami(k).ToString & "]が文字化けしていたようなので0に置き換えました。"
                                    Nakami(k) = 0
                                End If
                                strSQL.Append("" & Nakami(k).ToString & "")
                         End If
                         If k <> .Rows.Count - 1 Then strSQL.Append(",")
                  Next
                  strSQL.Append(")")
End With
Call Std.ADONET.ExecuteNonQuery(objTR, strSQL.ToString)
End While
objSR.Close()