2025/10/30

CSV ファイルの読み込み ④ - ファイルの読み込み 文字コードの設定

今回の記事にあたって郵便局の郵便番号ダウンロードサイトを見ていると新しいデータ形式のダウンロードが始まったことを確認しました(新しいといっても 2023 年のことで、すでに 2 年以上前ですが...)。

住所の郵便番号(1レコード1行、UTF-8形式)(CSV形式)

従前のデータでは、条件によっては 1 郵便番号が 2 レコードになるパターンがあったようなのですが、このデータでは発生しないようです。これが当たり前だと思うのですが、このデータであれば安心して利用できますね。また、カタカナが半角から全角文字になっているのもありがたいと感じます。

ただ、このデータはこれまでと違い UTF-8 形式となっています。ということで、今回は文字コードを意識したファイルの読み込みを行います。


文字コードの指定

CSV ファイルの読み込み ① - ファイルの準備』で Open ステートメントを紹介しました。この時はあえて省略したのですが、オプションで文字コードセットを指定する機能があります。例えば UTF-8 を指定する場合は次のようになります。

Open "c:\tmp\utf_ken_all.csv" For Input As #iFP Charset = "UTF-8"

この部分だけは VBA の名前付き引数のような記述で、LotusScript ではあまり見ない感じですね。VBA の名前付き引数の指定は := ですが、ここでは = だけなので注意してください。

= の後ろが指定できる文字コードセットで UTF-8 以外にも多数の指定ができます。詳しくはデザイナーヘルプの『MIME 文字セット名』を参照してください(Open ステートメントのヘルプからリンクされています)。


読み込みの仕様

まず、読み込んだデータを保存するフォームを作成します。

今回作成するサンプルで CSV データから取得する項目は赤字の部分となります。

01101,"064 ","0640941","ホッカイドウ","サッポロシチュウオウク","アサヒガオカ","北海道","札幌市中央区","旭ケ丘",0,0,1,0,0,0

最初のカラムは全国地方公共団体コードです。前 2 桁は都道府県コード(JIS X0401)、後ろ 3 桁は市区町村コード(JIS X0402)です。何かで利用できそうなので、別フィールドにそれぞれ保存することとします。


サンプルプログラム

UTF-8 形式の郵便番号 CSV ファイルを読み込むサンプルプログラムは次の通りです。ファイルオープン時に UTF-8 を指定しています。

前回と同様に読み込んだデータは xCSVtoList 関数で配列化しています。この配列にあわせて、セットするフィールド名を配列 asFldLst にあらかじめ用意しておきます。これらを利用して、文書に値をセットをループで実現し、シンプルなメインルーチンにできました。前回 のまとめで ”構造化との相性が高い” としたのはこういった記述ができるからですね。

Option Declare

Sub Initialize
   Dim ns As New NotesSession
   Dim ndb As NotesDatabase
   Dim nd As NotesDocument

   Dim iFP As Integer
   Dim vLine As Variant
   Dim sLine As String
   Dim i As Integer
   Dim l As Long

   Dim asFldLst() As String     '保存フィールド名

   '保存フィールド名初期化
   ReDim asFldLst(8)
   asFldLst(0) = "JisCode"
   asFldLst(2) = "ZipCode"
   asFldLst(3) = "Address1_Kn"
   asFldLst(4) = "Address2_Kn"
   asFldLst(5) = "Address3_Kn"
   asFldLst(6) = "Address1_Kj"
   asFldLst(7) = "Address2_Kj"
   asFldLst(8) = "Address3_Kj"


   '初期化
   Set ndb = ns.CurrentDatabase

   'ファイルオープン
   iFP = FreeFile()
   Open "c:\tmp\utf_ken_all.csv" For Input As #iFP Charset = "UTF-8"

   On Error GoTo Err_Loop        ’エラー処理有効化

   '1 行目取得
   Line Input #iFP, sLine
   Do Until EOF(iFP)
      l = l + 1

      'CSV の 1 行を項目ごとの配列に分離
      vLine = xCSVtoList(sLine)

      '読み込んだデータを文書に保存
      Set nd = ndb.CreateDocument()

      nd.Form = "fZip"

      For i = 0 To UBound(asFldLst)
         If asFldLst(i) <> "" Then
            Call nd.Replaceitemvalue(asFldLst(i), vLine(i))
         End If
      Next


      '全国地方公共団体コード の処理
      nd.JisCode_Pref = Left(vLine(0), 2)      '都道府県コード(JIS X0401)
      nd.JisCode_City = Right(vLine(0), 3)   '市区町村コード(JIS X0402)

      Call nd.Save(True, True)

Loop_Next:
      '次の行取得
      Line Input #iFP, sLine
   Loop

   Exit Sub

Err_Loop:
   Print CStr(l) & " 行目の処理でエラーが発生しました。"
   Resume Loop_Next
End Sub

なお、関数 xCSVtoList は前回掲載したまま変更がないので割愛しています。


0 件のコメント:

コメントを投稿