前回は Input # による CSV ファイルの読み込みについて紹介しました。今回はもう一つの読み込み命令である Line Input # を紹介します。
Line Input #
この命令はテキストファイルから 1 行分のデータを読み込む命令となります。Input # とは違い行単位で処理できるので、CSV だけでなく可変長のテキストファイルなど、より自由なフォーマットのファイル操作にも対応できます。
| Line Input #fileNumber , varName |
| fileNumber | データを読み込むファイル番号 |
| varName | 読み込んだ 1 行分のデータをセットする変数 |
サンプルプログラム
では、Line Input # を使用した CSV ファイル読み込みエージェントを紹介します。
前回の Input # のサンプルと違うのは、CSV データ 1 行分を変数 sLine に読み込み、関数 xCSVtoList で項目ごとに分離している点です。
|
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 '初期化 Set ndb = ns.CurrentDatabase 'ファイルオープン iFP = FreeFile() Open "c:\tmp\KEN_ALL_ROME.CSV" For Input As #iFP '1 行目取得 Line Input #iFP, sLine Do Until EOF(iFP) 'CSV の 1 行を項目ごとの配列に分離 vLine = xCSVtoList(sLine) '読み込んだデータを文書に保存 Set nd = ndb.CreateDocument() nd.Form = "fZip_Rome" nd.ZipCode = vLine(0) nd.Address1_Kj = vLine(1) nd.Address2_Kj = vLine(2) nd.Address3_Kj = vLine(3) nd.Address1_En = vLine(4) nd.Address2_En = vLine(5) nd.Address3_En = vLine(6) Call nd.Save(True, True) '次の行取得 Line Input #iFP, sLine Loop Close End Sub Private Function xCSVtoList(ByVal vsLine As String) As Variant Dim v As Variant Dim i As Integer Dim s As String 'カンマで分離(文字列内のカンマは考慮しない) v = Split(vsLine, ",") For i = LBound(v) To UBound(v) '各要素の前後のダブルクォーテーションを削除 s = v(i) If Left(s, 1) = |"| Then s = Right(s, Len(s)-1) End If If Right(s, 1) = |"| Then s = Left(s, Len(s)-1) End If v(i) = s Next xCSVtoList = v End Function |
今回の CSV ファイルでは文字列内にダブルクォーテーションやカンマが入る前提としていないので、xCSVtoList 内の処理は非常に単純な仕様としています。
まとめ
今回は Line Input # を使用した CSV 取り込みを紹介しました。Line Input # と前回の Input # と基本的な機能で比較してみます。
| Line Input # | Input# | |
| 読み取り単位 | カンマや改行で区切られた項目単位 | 1 行単位 |
| クォート(")の扱い | そのまま文字として読み取る | 文字列では自動削除 |
| 型変換 | 常に文字列(自身で変換) |
変数に応じて自動変換 |
| CSV 向き? | Split などで手動で分離 | 簡易的な CSV なら自動対応 |
一見 Input # の方が優勢に見えますね。ただ、プログラミングに力点を置いて比較すると立場が逆転します。
| Line Input # | Input# | |
| 応用性 | 高い | 低い |
| CSV 以外にも対応 クォート、可変列なども自力で自由に処理 |
CSV 以外はほぼ無理 | |
| 構造化との 相性 |
高い | 微妙 |
| 配列処理やクラス化しやすい 型変換や検証が柔軟 |
直接変数に読み込むため構造化に不向き | |
| データ検証 | 容易 | 困難 |
| 生データを扱えるので、欠損や不正などチェックしやすい | エラーが発生せず、初期値となることがある | |
| 例外処理の 自由度 |
高い | 低い |
| 自力で自由にチェックできる | 想定外のデータでずれ、エラーが出ない | |
| 保守性 | 高い | 低い |
| 読み込みルールを変更しやすい | 変数定義と一致させるため、全体修正が必要となることも |
与えられるデータに含まれる文字や精度、将来想定される修正などを考慮の上、状況に応じた使い分けが必要な感じです。まるで、ローコードとプロコードの比較のようですね。

0 件のコメント:
コメントを投稿