[Notes/Domino] CSVの1行を取得する方法(項目内改行対応版)
(2017/10/16 全面的に書き換えました)
CSVの規則によると、引用符(ダブルクォーテーション)内では、改行を入れていいことになっています。が、Line Input では改行までを1行として読み込むので、これに対応しようと思うとちょっと面倒なことになります。そんな面倒を解消するため、手軽に扱える関数を作ってみました。
説明 | CSVの1行を取得して配列化(項目内改行対応版) |
---|---|
構文 | GetCSVLine(Byval intFno As Integer, Byval strDelim As String, Byval strQuote As String) As Variant |
引数 | [in,---]intFno ... ファイル番号 [in,---]strDelim ... デリミタ [in,---]strQuote ... 引用符 |
戻り値 | CSVの1行分を配列化した値 |
※CSVのルールに反したデータは想定していません。より厳密にやるなら、エラーチェックなどを入れてください。
ソースコード
Public Function GetCSVLine(ByVal intFno As Integer, _ ByVal strDelim As String, ByVal strQuote As String) As Variant Dim strCsv As String Dim strRet() As String Dim strBuf As String Dim bln1st As Boolean Dim blnQuote As Boolean strBuf = "" bln1st = True Do If EOF(intFno) Then If strBuf <> "" Then Call AryPush(strRet, strBuf) End If Exit Do End If Line Input #intFno, strCsv Do Until strCsv = "" Select Case Left(strCsv, 1) Case strQuote If bln1st = True Then blnQuote = True bln1st = False Else If blnQuote = True Then If Left(strCsv, 2) = strQuote & strQuote Then strBuf = strBuf & strQuote strCsv = Mid(strCsv, 2) Else blnQuote = False End If Else strBuf = strBuf & strQuote End If End If Case strDelim If blnQuote = True Then strBuf = strBuf & strDelim Else Call AryPush(strRet, strBuf) strBuf = "" bln1st = True End If Case Else strBuf = strBuf & Left(strCsv, 1) bln1st = False End Select strCsv = Mid(strCsv, 2) Loop If blnQuote = True Then strBuf = strBuf & Chr(13) & Chr(10) ElseIf strBuf <> "" Then Call AryPush(strRet, strBuf) End If Loop Until blnQuote = False If AryIsUninit(strRet) = True Then Call AryPush(strRet, "") End If GetCSVLine = strRet End Function Public Sub AryPush(varAry As Variant, varVal As Variant) Dim intMax As Integer If IsArray(varAry) = False Then Exit Sub End If On Error GoTo ERR_INIT intMax = UBound(varAry) + 1 On Error GoTo 0 ReDim Preserve varAry(intMax) varAry(intMax) = varVal Exit Sub ERR_INIT: intMax = 0 ReDim varAry(0) Resume Next End Sub Public Function AryIsUninit(varAry As Variant) As Boolean Dim intMin As Integer On Error GoTo ERR_INIT intMin = LBound(varAry) On Error GoTo 0 AryIsUninit = False Exit Function ERR_INIT: AryIsUninit = True Exit Function End Function
使い方
Dim varAry As Variant Dim intFno As Integer intFno = FreeFile() Open "C:\test.csv" For Input As #intFno Do Until EOF(intFno) varAry = GetCSVLine(intFno, ",", |"|) '処理 Loop Close #intFno
コメント
コメントはありません
※コメントは承認制となっております。管理者が承認するまで表示されません。申し訳ありませんが、投稿が表示されるまでしばらくお待ちください。