[2018/03/22] CSVファイル書込処理 (No.13)
[2018/03/22] CSVファイル読込処理 (No.12)
[2018/03/22] フォルダ名の最終文字列"\"チェック (No.11)
[2018/03/22] ファイル上書きコピー (No.10)
[2018/03/22] テキストファイルレコード件数取得 (No.9)
-
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
-
文字列の2次元配列の内容をCSVファイルに全て書き込む関数を説明します。 CSVファイルに書込む方法は、比較的簡単で、指定されたカラムデータに「”」(ダブルクォート)を全て付加して書込めばできます。
書込みは「Shift-JIS」のEncodingを指定し、System.IO.StreamWriterでファイルを開き、 指定されたカラムデータを順次書き込んで処理します。
今回の関数では CSVファイルの読込について で読込まれたデータを書込むことを 前提にしていますので、書き込みデータは文字列の2次元配列で指定します。
この関数では、全てのカラムデータにダブルクォートで囲っていますが、ダブルクォートが必要なデータのみ囲みたい場合には 指定されたカラムデータ文字列がダブルクォートを必要としているかを検査して処理する必要があります。 文字列の中に、カンマ、タブ、CR、LFが含まれていたり、前後に空白が在ればダブルクォートを必要とします。CSVファイル書込処理
''' ----------------------------------------------------------------------------- '''
''' CSVファイルの書込処理 ''' ''' <param name="astrFileName">ファイル名</param> ''' <param name="aarrData">書込データ文字列の2次元配列</param> '''True:結果OK, False:NG '''カラム名をファイルに出力したい場合は、書込データの先頭に設定すること ''' ----------------------------------------------------------------------------- Private Function WriteCsv(ByVal astrFileName As String, ByVal aarrData As String()()) As Boolean WriteCsv = False 'ファイルStreamWriter Dim sw As System.IO.StreamWriter = Nothing Try 'CSVファイル書込に使うEncoding Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS") '書き込むファイルを開く sw = New System.IO.StreamWriter(astrFileName, False, enc) For Each arrLine() As String In aarrData Dim blnFirst As Boolean = True Dim strLIne As String = "" For Each str As String In arrLine If blnFirst = False Then '「,」(カンマ)の書込 sw.Write(",") End If blnFirst = False '1カラムデータの書込 str = """" & str & """" sw.Write(str) Next '改行の書込 sw.Write(vbCrLf) Next '正常終了 Return True Catch ex As Exception 'エラー MsgBox(ex.Message) Finally '閉じる If sw IsNot Nothing Then sw.Close() End If End Try End Function '仮にテストプログラム Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Try 'CSVファイル読込処理 Dim arrCsv()() As String = ReadCsv("test.csv", False, False) 'CSVファイル書込処理 Dim blnRet As Boolean = WriteCsv("testw.csv", arrCsv) Catch ex As Exception MsgBox(ex.Message) End Try End Sub関連する記事
⇒CSVファイルの読込について :[Microsoft.VisualBasic.FileIO.TextFieldParser]
⇒CSVファイルの DataGridView への読込について
⇒DataGridView からCSVファイルへの書込について
PR -
CSVファイルを全て読み込み、文字列の2次元配列に戻す関数を説明します。 CSVファイルを読み込むには、Microsoft.VisualBasic.FileIO.TextFieldParserクラスを使用すると割と簡単に処理すことができます。
CSVファイル名を指定し、TextFieldParserクラスのインスタンスを作成し、 さらに区切りの指定及びフィールドが引用符で囲まれているかの指定を行います。
実際のファイルの読込は、1行ずつをReadFields()関数で行います。結果は文字列配列に返りますのでそれを適切に処理してやります。 読込のループの先頭でEndOfDataプロパティをチェックし、これがTrueであれば読込が最後まで来ています。 ループを抜けてファイルを閉じてやればOKです。
関数の戻り値として、文字列の2次元配列にしていますので呼び出し側の処理の例を載せておきます。CSVファイル読込処理
''' ----------------------------------------------------------------------------- '''
''' CSVファイルの読込処理 ''' ''' <param name="astrFileName">ファイル名</param> ''' <param name="ablnTab">区切りの指定(True:タブ区切り, False:カンマ区切り)</param> ''' <param name="ablnQuote">引用符フラグ(True:引用符で囲まれている, False:囲まれていない)</param> '''読込結果の文字列の2次元配列 ''' ----------------------------------------------------------------------------- Private Function ReadCsv(ByVal astrFileName As String, ByVal ablnTab As Boolean, ByVal ablnQuote As Boolean) As String()() ReadCsv = Nothing 'ファイルStreamReader Dim parser As Microsoft.VisualBasic.FileIO.TextFieldParser = Nothing Try 'Shift-JISエンコードで変換できない場合は「?」文字の設定 Dim encFallBack As System.Text.DecoderReplacementFallback = New System.Text.DecoderReplacementFallback("?") Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding("shift_jis", System.Text.EncoderFallback.ReplacementFallback, encFallBack) 'TextFieldParserクラス parser = New Microsoft.VisualBasic.FileIO.TextFieldParser(astrFileName, enc) '区切りの指定 parser.TextFieldType = FieldType.Delimited If ablnTab = False Then 'カンマ区切り parser.SetDelimiters(",") Else 'タブ区切り parser.SetDelimiters(vbTab) End If If ablnQuote = True Then 'フィールドが引用符で囲まれているか parser.HasFieldsEnclosedInQuotes = True End If 'フィールドの空白トリム設定 parser.TrimWhiteSpace = False Dim strArr()() As String = Nothing Dim nLine As Integer = 0 'ファイルの終端までループ While Not parser.EndOfData 'フィールドを読込 Dim strDataArr As String() = parser.ReadFields() '戻り値領域の拡張 ReDim Preserve strArr(nLine) '退避 strArr(nLine) = strDataArr nLine += 1 End While '正常終了 Return strArr Catch ex As Exception 'エラー MsgBox(ex.Message) Finally '閉じる If parser IsNot Nothing Then parser.Close() End If End Try End Function '仮にテストプログラム Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Try Dim arrCsv()() As String = ReadCsv("test.csv", False, False) Dim strData As String = "" For Each arr() As String In arrCsv For Each str As String In arr strData &= str & "," Next strData &= vbCrLf Next MsgBox(strData) Catch ex As Exception MsgBox(ex.Message) End Try End Sub
関連する記事
⇒CSVファイルの書込について :[System.IO.StreamWriter]
⇒CSVファイルの DataGridView への読込について
⇒DataGridView からCSVファイルへの書込について
-
指定されたフォルダ名の最終文字が、ディレクトリの分離文字でない場合には、その文字を付加する関数です。 System.IO.Path.DirectorySeparatorChar はパス文字列の、ディレクトリレベルを区切るために使用する、 プラットフォーム固有の文字として定義されていますのでこれを使用します。
フォルダ名の最終文字列"\"チェック
''' ----------------------------------------------------------------------------- '''
''' フォルダ名の最終文字列"\"チェック ''' ''' <param name="strSrcFolder">フォルダ名</param> '''修正後のフォルダ名 ''' ----------------------------------------------------------------------------- Private Function ChkLastDirectorySeparatorChar(ByVal strSrcFolder As String) As String ' Dim strFolder As String = strSrcFolder Try '指定が空文字ならば空文字を返す If strFolder = "" Then Return "" End If '最終文字が"\"でなければ、"\"を付加する If strFolder.Chars((strFolder.Length - 1)) <> System.IO.Path.DirectorySeparatorChar Then strFolder &= System.IO.Path.DirectorySeparatorChar End If Return strFolder Catch ex As Exception Return strSrcFolder End Try End Function
関連する記事
⇒文字列定数(改行、タブ、バックスペース等)について
⇒文字列変換関数(StrConv)で変換が途中で切れる
⇒文字列変換関数(StrConv)の使い方
-
指定されたコピー元ファイルの存在を確認し、ファイルの FileInfo を取得し、 FileInfoのファイル長が0より大きい場合に、指定されたコピー先ファイルに上書きコピーを行う関数です。
コピー処理は、System.IO.File.Copy により上書きフラグをONして処理を行います。System.IO.FileInfo クラスについて
■コンストラクタ Public Sub New ( fileName ) fileName: ファイルのドライブ名からの完全パス名または相対ファイル名。 ■プロパティ抜粋 ・Length (Long) :現在のファイルのサイズをバイト単位で取得します。 ・Name (String) :ファイルの名前を取得します。ファイル拡張子が含まれています。 ・FullName (String) :ファイルのフルパス名を取得します。 ・DirectoryName(String) :ディレクトリの絶対パスを表す文字列。 ・Extension (String) :ファイルの拡張子部分を表す文字列を取得します。
ファイル上書きコピー
''' ----------------------------------------------------------------------------- '''
''' ファイル上書きコピー ''' ''' <param name="astrSrcFilePath">コピー元ファイルフルパス名</param> ''' <param name="astrDesFilePath">コピー先ファイルフルパス名</param> '''True:正常終了, False:エラー '''コピー元ファイルが存在しない場合、処理無し ''' ----------------------------------------------------------------------------- Public Function CopyFileOverwrite(ByVal astrSrcFilePath As String, ByVal astrDesFilePath As String) As Boolean '戻り値初期化 CopyFileOverwrite = False Try 'コピー元ファイル存在確認 If System.IO.File.Exists(astrSrcFilePath) = False Then '入力用ファイルが存在しない場合は、OKとする Return True End If Dim fileinfo As New System.IO.FileInfo(astrSrcFilePath) 'ファイルサイズ取得 If fileinfo.Length = 0 Then 'サイズ0の場合は、処理無しで正常戻り Return True End If 'コピー元入力用ファイルからコピー先ファイル上書きコピー System.IO.File.Copy(astrSrcFilePath, astrDesFilePath, True) '正常終了 Return True Catch ex As Exception 'エラー処理が必要な場合は、ここに記述する End Try End Function関連する記事
⇒フォルダコピー(サブフォルダ以下も含む):[Directory.GetFiles,Directory.GetDirectories]
⇒指定フォルダ内の全ファイルを削除 :[Directory.GetFiles,File.Delete]
⇒指定フォルダ内の全ファイルをクリア :[Directory.GetFiles,File.Delete]
⇒テキストファイル追記処理 :[File.ReadAllText,File.AppendAllText]
⇒テキストファイル先頭行削除処理 :[IO.StreamReader,IO.StreamWriter,Encoding.GetEncoding]
⇒ファイルサイズ取得 :[IO.FileInfo]
⇒テキストファイルレコード件数取得 :[IO.StreamReader]
-
指定されたテキストファイルパスとエンコーディングで StreamReader でオープンし、 ファイルを順次 StreamReader.Peek() 関数で読み込み、その回数でレコード件数を取得します。 StreamReader.Peek() 関数で読み込まれたデータは捨てています。
この関数自体は、指定ファイルの存在をチェックしていませんので、必要であればファイルオープン前に確認し、 ファイルが存在しない戻り値を返す必要があります。テキストファイルレコード件数取得
''' ----------------------------------------------------------------------------- '''
''' テキストファイルレコード件数取得 ''' ''' <param name="astrSrcFileName">入力ファイルフルパス名</param> ''' <param name="enc">ファイルのエンコーディング</param> '''レコード件数(-1:エラー発生) ''' ----------------------------------------------------------------------------- Public Function GetTextFileCount(ByVal astrSrcFileName As String, ByVal enc As System.Text.Encoding) As Integer '戻り値初期化 GetTextFileCount = -1 Try Dim intCnt As Integer = 0 '入力ファイルをオープンする Using sr As New System.IO.StreamReader(astrSrcFileName, enc) 'ファイルからレコードが存在するまで読込 While (sr.Peek() >= 0) 'ファイルから1行読込 Dim strRead As String = sr.ReadLine() '件数++ intCnt += 1 End While End Using '件数を返す Return intCnt Catch ex As Exception 'エラー処理が必要な場合は、ここに記述する End Try End Function関連する記事
⇒フォルダコピー(サブフォルダ以下も含む):[Directory.GetFiles,Directory.GetDirectories]
⇒指定フォルダ内の全ファイルを削除 :[Directory.GetFiles,File.Delete]
⇒指定フォルダ内の全ファイルをクリア :[Directory.GetFiles,File.Delete]
⇒テキストファイル追記処理 :[File.ReadAllText,File.AppendAllText]
⇒テキストファイル先頭行削除処理 :[IO.StreamReader,IO.StreamWriter,Encoding.GetEncoding]
⇒ファイルサイズ取得 :[IO.FileInfo]
⇒ファイル上書きコピー :[IO.FileInfo,File.Copy]