Skip to content

Visual Basic.NET いろいろなテクニック③

Posted in Visual Basic .NET, プログラム関係, and 技術メモ


業務アプリで使用できそうなものを五月雨に記録しておく。
まとまるまで待っていると忘れてしまうために・・・。ww

なお、このブログ内に記載しているソースの転載・転用については何も縛りはありません。
ご使用の状況の如何に問わず、作者たる当方は結果についてその責任を一切負いません。ご使用は自己責任の範囲でお願いいたします。

■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■
 

【Tab区切りでデータを出力】

 

マスタデータ等を別なシステム(別なプログラム)に渡す際に基本的なマスタ等を出力して引き渡し運用する場合があります。
(他ベンダー間の作成プログラムの利用等)
そんな時に一番手軽に思いつくのは「CSV形式で出力してやり取りする」ですが、マスタの構成・仕様にもより、商品名等の名称関係に「,」カンマを利用されていることがあります。その場合、CSV形式で出力した時データ内に含まれるカンマ分だけ項目が増えてしまう現象に悩まされてしまいます。
回避策としてはデータレコード内に含まれるカンマを別な文字に置き換える方法がありますが、マスタの内容に手を加えるのは何かとよろしくありません。
その為の対応策として「Tab」タブを区切り文字として利用することを考えてみました。
マスタの項目でリアルにTab文字を含むデータを作成されると意味はありませんが、業務システムのデータでタブ文字を含む必要性とその頻度はとても低いと思います。
下記サンプルは必要最小限の機能です。
<再考改良点>
1、タイトルが不要な場合はプロシージャの引数の[strTitle]をByVal->Optionalに切り替えて「項目タイトルのセット」部分に[strTitle]が指定なしの時の処理を追加する。
2、文字コードの対応範囲を広げる場合は「エンコーディング作成」した後の分岐処理で対応を増やす。
3、出力項目数を自動的に判断する方法を考慮する。
4、存在しないフォルダ(保存場所)を指定した場合にはエラーが発生するので処理を考慮する。

※エラー発生時にはスローしますので呼び出し元でエラーをキャッチした時、工夫してください。

    ''' <summary>
    ''' テキストファイル出力(ファイルを一行ずつ書込む):タブ区切り
    ''' </summary>
    ''' <param name="fpath">ファイルPATH</param>
    ''' <param name="cname">文字コード名</param>
    ''' <param name="dt">出力文字列データ</param>
    ''' <param name="strTitle">出力データ項目タイトル</param>
    ''' <param name="intSetColumn">出力データ項目数</param>
    ''' <remarks>
    ''' </remarks>

    Public Sub WriteText_Tab(ByVal fpath As String, ByVal cname As String, ByVal dt As DataTable, ByVal strTitle As String, ByVal intSetColumn As Integer)

        Dim sw As System.IO.StreamWriter = Nothing
        Dim strRecData As String = String.Empty
        Try
            ' エンコーディング作成
            Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding(cname)

            If cname = "UTF-8" Then
                ' UTF-8
                enc = New System.Text.UTF8Encoding(False)
            ElseIf cname = "UNICODE" Then
                ' Unicode
                enc = New System.Text.UnicodeEncoding(False, False)
            End If
            sw = New System.IO.StreamWriter(fpath, False, enc)

            ' 一行ずつ書込む
            For intI = 0 To dt.Rows.Count - 1

                strRecData = String.Empty

                '項目タイトルのセット
                If intI = 0 Then
                    sw.WriteLine(strTitle)

                End If

                For intA = 0 To intSetColumn - 1
                    If intA = (intSetColumn - 1) Then
                        strRecData = strRecData & dt.Rows(intI).Item(intA)
                    Else
                        strRecData = strRecData & dt.Rows(intI).Item(intA) & vbTab
                    End If
                Next

                sw.WriteLine(strRecData)

            Next

        Catch ex As Exception
            Throw ex

        Finally
            If sw Is Nothing = False Then sw.Close()

        End Try

    End Sub

Be First to Comment

    コメントを残す

    メールアドレスが公開されることはありません。 が付いている欄は必須項目です

    CAPTCHA