RFC4180準拠 のCSVパーサ
Twitterで以下のような発言を見かけた。
おっ、ちょうど RFC4180準拠( http://www.kasai.fm/wiki/rfc4180jp )のCSVパーサを作ったところだったので公開します。
返却される値はCollecitonの中にCollectionがネストした形になります。
固有のクラス(StringBuilderやCharCursor)を使用しているのはご容赦。一番したのURLから全体のソースをご確認ください。
'-------------------------------------------------------------- ' CSVパーサー RFC4180準拠 ' コーテーションの有無, デリミタ指定あり '-------------------------------------------------------------- Public Function CsvParser(ByVal strBuf As String, Optional ByVal Quatation As Boolean = False, Optional ByVal Delimiter As String = ",") As Collection Const C_QUAT As String = """" Dim IC As ICursor Dim sw As Boolean Dim blnLineBreak As Boolean Dim blnItemBreak As Boolean Dim Col As Collection Dim Row As Collection Dim lngQuot As Long lngQuot = 0 sw = False Set Row = New Collection Set IC = Constructor(New CharCursor, strBuf) Do Until IC.Eof '初期化 Set Col = New Collection blnLineBreak = False Do Until IC.Eof Or blnLineBreak '初期化 Dim SB As StringBuilder Set SB = New StringBuilder blnItemBreak = False Do Until IC.Eof Or blnLineBreak Or blnItemBreak Select Case IC.Item Case C_QUAT 'コーテーションありの場合 If Quatation Then lngQuot = lngQuot + 1 If sw Then '次の文字がQuatation If IC.Item(1) = C_QUAT Then lngQuot = lngQuot + 1 SB.Append C_QUAT IC.MoveNext Else sw = False End If Else sw = True End If End If Case vbCr If sw Then SB.Append IC.Item End If Case vbLf If sw Then SB.Append IC.Item Else blnLineBreak = True End If Case Delimiter If sw Then SB.Append IC.Item Else blnItemBreak = True End If Case Else SB.Append IC.Item End Select IC.MoveNext Loop '列追加処理 Col.Add SB.ToString Loop '行追加処理 Row.Add Col Loop 'ダブルコーテーションが偶数ではない場合 If lngQuot Mod 2 <> 0 Then Message.Throw 1, Me, "CsvParser", "Invalid Format(Quotation)" End If Set CsvParser = Row End Function
呼び出し方サンプル
Sub CsvParser_Sample() Dim strBuf As String Dim Row As Collection Dim Col As Collection Dim v As Variant strBuf = "1, Watanabe, Fukushima, 36, ""カンマがあっても,OK""" & vbCrLf & "2, satoh, chiba, 24, ""改行があっても" & vbLf & "OKやで""" Set Row = StringHelper.CsvParser(strBuf, True) For Each Col In Row For Each v In Col Debug.Print v Next Next End Sub
イミディエイトウィンドウ
1 Watanabe Fukushima 36 カンマがあっても,OK 2 satoh chiba 24 改行があっても OKやで
全体のソースはGithubにて公開しています。
Hidennotare v1
https://github.com/RelaxTools/Hidennotare/blob/master/src/StringHelper.cls