top of page
執筆者の写真yuji fukami

テキストファイルを読み込んで配列に格納

更新日:1月17日


<概要>


 今回は、指定パスのテキストファイルを読み込んで配列に格納する汎用プロシージャを紹介します。


 読み込むテキストファイルはフルパスで指定しますが、テキストファイルの各行がカンマ「,」区切りやTab区切りの場合は、その区切りの数だけ列数の二次元配列を返します。データを二次元配列として取得することで、次に処理しやすい形式として扱うことが可能となります。

 

 また、テキストファイルの文字エンコーディングはUTF-8、UTF-16、ShiftJISから選択も可能です。読み込むテキストファイルの形式に合わせて設定してください。

 


<用途>


  • テキストファイルを読み込む



<プロシージャ紹介>


Public Function InputText(FilePath As String, StringEncode As EnumStringEncode, [Delimiter As String = "",""], [NewLine As String = vbCrLf]) As Variant


名前: InputText /Functionプロシージャ

説明: テキストファイルを読み込んで二次元配列として返す

文字エンコーディングはUTF-8,UTF-16,ShiftJISから選択


'引数

FilePath ・・・テキストファイルのフルパス

StringEncode・・・文字エンコーディング

[Delimiter] ・・・区切り文字

[NewLine] ・・・改行文字(デフォルトでvbCrLf)

  他vbLf,vbCrを設定可能



<実行例>


 次のようなコードを用意します。

 なおOneDriveの影響も考慮してConvOneDrivePath_LocalPathプロシージャを利用しています。

Public Sub TestInputText()
    
    'フォルダパス指定
    Dim Path As String: Path = ThisWorkbook.Path
    Path = ConvOneDrivePath_LocalPath(Path)
    
    'テキストファイル読込
    Dim TextFile_Comma As Variant
    Dim TextFile_Tab   As Variant
    TextFile_Comma = InputText(Path & "\" & "Test_Comma.txt", vbUTF8, ",")
    TextFile_Tab = InputText(Path & "\" & "Test_Tab.txt", vbUTF8, Chr(9))
    
    Stop 'ローカルウィンドウを確認すべし
    
End Sub

 

 フォルダ内には「Test_Comma.txt」と「Test_Tab.txt」の2つのテキストファイルが用意されています。


 2つのテキストファイルの中身は次のようになっています。「Test_Comma.txt」は各行の値がカンマ「,」で区切られており、「Test_Tab.txt」の場合はTabで区切られています。


 Test_Comma.txtの中身








 Test_Tab.txtの中身







 先ほどのコードを実行あとに、ローカルウィンドウを確認すると変数TextFile_Comma、TextFile_Tabには二次元配列としてテキストファイルの中身が格納されているのが確認できます。















 

<技術解説>

 InputTextプロシージャは第2引数で文字エンコーディングを選択できますが、コーディング中に入力候補がるようになっています。こちらはユーザー定義のEnum(EnumStringEncode)を引数の型として指定することで可能となるテクニックです。プロシージャの引数で複数の機能から選択させたい場合などで有効的です。



 ユーザー定義のEnum(EnumStringEncode)









<サンプルファイル>




<コード>

 

 Gist


'InputText        ・・・元場所:IkiAddin.ModFile
'InputTextUTF     ・・・元場所:IkiAddin.ModFile
'InputTextShiftJIS・・・元場所:IkiAddin.ModFile

'宣言セクション※※※※※※※※※※※※※※※※※※※※※※※※※※※
'-----------------------------------
'元場所:IkiAddin.ModFile.EnumStringEncode
Public Enum EnumStringEncode
    vbUTF8
    vbUTF16
    vbShiftJIS
End Enum
'宣言セクション終了※※※※※※※※※※※※※※※※※※※※※※※※※※※

Public Function InputText(ByRef FilePath As String, _
                      ByRef StringEncode As EnumStringEncode, _
                Optional ByRef Delimiter As String = ",", _
                  Optional ByRef NewLine As String = vbCrLf) _
                                         As Variant
'テキストファイルを読み込んで二次元配列として返す
'文字エンコーディングはUTF-8,UTF-16,ShiftJISから選択
'20240105 リファクタリング

'参考
'https://www.softex-celware.com/post/inputtext
    
'引数
'FilePath    ・・・テキストファイルのフルパス
'StringEncode・・・文字エンコーディング
'[Delimiter] ・・・区切り文字
'[NewLine]   ・・・改行文字(デフォルトでvbCrLf)
'                  他vbLf,vbCrを設定可能

    '処理
    Dim Text As String
    Select Case StringEncode
        Case vbUTF8
            Text = InputTextUTF(FilePath, "utf-8")
        
        Case vbUTF16
            Text = InputTextUTF(FilePath, "utf-16")
        
        Case vbShiftJIS
            Text = InputTextShiftJIS(FilePath)
        
    End Select
    
    '二次元配列に変換
    Dim ListLines As Variant: ListLines = Split(Text, NewLine) '改行で区切る
    Dim I         As Long
    Dim J         As Long
    Dim N         As Long: N = UBound(ListLines, 1) + 1
    Dim M         As Long
    Dim Line      As String
    For I = 0 To UBound(ListLines, 1)
        Line = ListLines(I)
        If InStr(Line, Delimiter) > 0 Then
            M = WorksheetFunction.Max(M, UBound(Split(Line, Delimiter), 1) + 1)
        End If
    Next
    
    Dim Output   As Variant: ReDim Output(1 To N, 1 To M)
    Dim TmpSplit As Variant
    For I = 0 To UBound(ListLines, 1)
        Line = ListLines(I)
        If InStr(Line, Delimiter) > 0 Then
            TmpSplit = Split(Line, Delimiter)
            For J = 0 To UBound(TmpSplit, 1)
                Output(I + 1, J + 1) = TmpSplit(J)
            Next
        Else
            Output(I + 1, 1) = Line
        End If
    Next
    
    '出力
    InputText = Output
    
End Function

Private Function InputTextUTF(ByRef FilePath As String, _
                                   ByRef UTF As String) _
                                             As String
'テキストファイルを読み込む
'テキストファイルの文字エンコーディングはUTF-8,UTF-16を対象とする
'20231218

'引数
'FilePath・・・テキストファイルのフルパス
'UTF     ・・・文字エンコーディング

    '処理
    Dim stream As Object: Set stream = CreateObject("ADODB.Stream")
    stream.Type = 2 '2:テキストファイル
    stream.Charset = UTF ' 文字エンコーディングを指定
    stream.Open
    stream.LoadFromFile FilePath
    
    Dim Output As String: Output = stream.ReadText
    stream.Close
    
    '出力
    InputTextUTF = Output
        
End Function

Private Function InputTextShiftJIS(ByRef FilePath As String) As String
'テキストファイルを読み込む
'テキストファイルの文字エンコーディングはShiftJISを対象とする
'20231218

'引数
'FilePath・・・テキストファイルのフルパス

    '処理
    Dim TmpText As String
    Dim Output  As String: Output = ""
    Dim FileNo  As Long: FileNo = FreeFile
    
    Open FilePath For Input As #FileNo
    Do Until EOF(FileNo)
        Line Input #FileNo, TmpText
        Output = Output & TmpText & vbCrLf
    Loop
    
    Close #FileNo
    
    '出力
    InputTextShiftJIS = Output
        
End Function

閲覧数:494回0件のコメント

最新記事

すべて表示

OneDriveのhttp形式のパスをローカル上のパスに変換

<概要> 今回は、OneDriveのhttp形式のパスをローカル上のパスに変換する汎用プロシージャを紹介します。 OneDriveを起動中だとThisWorkbook.Path(ThisWorkbookが保存されているフォルダのフルパス)の値がhttp形式になってしまうので...

Comments


bottom of page