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