テキストファイルソースの接続文字列パラメータ
前回の記事では、Excelデータソースの接続文字列パラメーターについて説明しました。次に、テキストファイルに焦点を当てます。テキストファイルのスキーマを記述し、Accessで開いたりリンクしたりするときに情報を使用するには、さまざまな方法があります。 Excelスプレッドシートは構造に似ていますが、これはテキストファイルには当てはまりません。テキストファイルの構造に関するいくつかの質問に答える必要があります。
- 幅は区切られていますか、それとも固定ですか?
- 1つの列がいつ終了し、他の列がいつ開始するかをどのように判断しますか?
- テキストは引用されていますか?
- 日付と時刻をどのように解析する必要がありますか?
- 通貨の金額はどうですか?どのようにフォーマットする必要がありますか?
そしておそらくもっと。 CSVは一見明確に定義されているように見えるかもしれませんが、それを掘り下げると、実際には非常に大まかに定義されています。テキストを引用するかどうか、日付をどのようにフォーマットするかについては、普遍的な合意はありません。これらすべての理由から、テキストファイルを使用するには、通常、テキストファイルの構造を説明するために何らかのスキーマ情報を使用する必要があります。スキーマ情報を保存する方法は3つあります。
-
schema.ini
ディレクトリに保存されているファイル - アクセスの
MSysIMEX
およびMSysIMEXColumns
テーブル - アクセスの
ImportExportSpecification.XML
プロパティ。
問題を複雑にするために、テキストファイルを操作するために使用できるいくつかの異なる方法がありますが、すべての方法がスキーマ情報を取得する3つの異なる方法すべてを使用できるわけではありません。例: DoCmd.TransferText
システムテーブルでは機能しますが、保存されたインポート/エクスポートでは機能しません。一方、 DoCmd.RunSavedImportExport
ImportExportSpecification
で動作します 物体。ただし、 ImportExportSpecification
リンクの一部としては使用されません。したがって、ここでの説明では、テキストファイルを開いたりリンクしたりする場合に使用できるメソッドは実際には2つだけです。仕様をMSysIMEXSpecs
に保存することの違いに注意することが重要です。 & MSysIMEXColumns
テーブルとImportExportSpecification
になるインポート/エクスポートの保存 物体。これらの2つの方法については、次の記事で説明します。
テキストファイルの接続文字列
Accessがテキストファイルをどのように認識するかを検討する必要があります。前回の記事では、各シートまたは名前付き範囲がExcelスプレッドシートの「データベース」で「テーブル」として表されていることを確認しました。しかし、テキストファイルにはそのような構成はありません。では、何が「データベース」になるのでしょうか。答えは、フォルダが「データベース」を表しているため、フォルダ内のテキストファイルはすべて「テーブル」であるということです。そのため、フォルダ内に保存されているテキストファイルの形式が複数含まれている場合は、同じフォルダに複数のスキーマ情報を含めることができます。後で、接続文字列を作成するときに、フォルダにリンクしてから、個々のファイルにテーブルとしてアクセスすることがわかります。
したがって、次のようにこの設定を使用します。
次に、次のVBAコードを使用してテキストファイルを開くことができます:
Dim db As DAO.Database Set db = DBEngine.OpenDatabase(vbNullString, False, False, "Text;DATABASE=C:\Links") Dim tdf As DAO.TableDef For Each tdf In db.TableDefs Debug.Print tdf.Name Dim fld As DAO.Field For Each fld In tdf.Fields Debug.Print fld.Name, Next Debug.Print Dim rs As DAO.Recordset Set rs = tdf.OpenRecordset Do Until rs.EOF For Each fld In rs.Fields Debug.Print fld.Value, Next Debug.Print rs.MoveNext Loop Debug.Print Nextを出力します。
これにより、次の出力が得られます:
Products#csv Products Count PackDate Amount ShipDate Apples 3 12/4/2020 $ 1.02 4/12/2020 Bananas 5 4/12/2020 $ 1,234.56 12/4/2020 Figs 8 5/7/2020 $ 0.01 7/5/2020 Grapes 11 10/10/2020 $12.30 10/10/2020
次の点に注意してください。
- 接続文字列にテキストファイルを指定しませんでした。代わりにフォルダを使用しました。
- 名前のドットが有効な文字ではないため、「テーブル」の名前が変更されました。エルゴ、
products.csv
products#csv
になりました 。 - Excelと比較して、テキストファイルドライバーとフォルダーへのパスを指定する以外に必須のパラメーターはありません。
次の記事では、テキストファイルのスキーマの説明について詳しく学習します。ただし、接続文字列自体については、以下のキーワードが認識されます。
FMT
パラメータ:テキストファイルの形式を示します。
区切り
:ファイルは文字で区切られています。使用される文字は、スキーマ情報によって指定されます。固定
:ファイルの列の幅は固定されています。この場合も、特定の列幅はスキーマ情報によって指定されます。
HDR
パラメータ:ヘッダー行
はいコード> :最初の行はヘッダーであり、「テーブル」/「レコードセット」の列名になる必要があります
NO
:最初の行は同じように扱われ、単なるデータです。すべての列名には「FN」という名前が付けられます。「N」は1で始まる数字です
IMEX
パラメータ:インポート/エクスポート動作
これは、内容に基づいて列のデータ型を定義する方法を管理します:
1
:列に異なるデータ型が含まれている場合は、文字列として扱います。それ以外の場合は、列を最適なデータ型に一致させます。
2
:サンプルに基づいて、列を常に特定のデータ型に一致させます。予想されるデータ型と一致しないデータを含む行を読み取るときに、読み取りエラーが発生する可能性があります。
ACCDB
パラメータ:AccessがACCDBファイル形式を使用していることを示しますか?
デフォルトでは、これは常にaccdbファイル形式でACCDB=YESに設定されます。ただし、省略したり、NOに設定したりしても何も起こらないようです。少し謎です。このパラメータの影響を誰かが共有できる場合は、コメントで投稿してください。ブログを更新します。
データベース
パラメータ:テキストファイルを含むフォルダへのパス
パラメータには、完全修飾パスが含まれている必要があります。テキストファイルの名前は含めないでください。
CharacterSet
パラメータ:テキストファイルの読み取りに使用する文字エンコードを識別します。
これについては、次の記事で詳しく説明します。これは、スキーマ情報でも説明できます。
DSN
パラメータ:テキストファイルで使用するスキーマ情報を識別します。
名前はMSysIMEXSpec
に対応している必要があります 、これについては後の記事で分析します。これは、 MSysIMEX ***
でのみ機能します テーブル。 schema.ini
を使用する場合 、単に DSN
を含めないだけです 接続文字列で。
テキストファイルドライバは、上記のパラメータのみを考慮することに注意してください。他のキーワードを入力して、テキストファイルドライバで解析することはできません。そのため、接続文字列だけでテキストファイルの詳細をすべて指定することはできません。
テキストファイルのデフォルトスキーマ
理論的には、スキーマ情報なしでテキストファイルを開いたりリンクしたりできますが、これが機能することはめったにありません。この状況では、Accessはさまざまなオプションのデフォルトを単純に想定します。テキストファイルが現在のすべてのデフォルトに準拠している場合、Accessはファイルの読み取りに成功します。さらに重要なことに、テキストファイルを開いたりリンクしたりする際にエラーがないからといって、データが意味のある形で表現されているわけではありません。たとえば、特別にフォーマットされた通貨の金額は、通貨ではなくテキストとして解釈される可能性があり、テキスト内にコンマが含まれる区切られていないテキストは誤って解析され、不要な列が追加される可能性があります。デフォルトは2つの可能な場所で決定されます:
- Accessはレジストリ設定を確認します。 Office 365をインストールする場合、レジストリは次の場所にあります。
Computer \ HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Office \ ClickToRun \ REGISTRY \ MACHINE \ Software \ Microsoft \ Office \ 16.0 \ Access Connectivity Engine \ Engines \ Text
。次の記事では、この場所を「テキストレジストリキー」と呼びます。 地域
に表示される設定 Windowsのコントロールパネルのアプレット。この場所を「Windows設定」と呼びます。
テキストファイルのエンコードに関する注意
テキストファイルへのアクセスに使用する方法に関係なく、正しいエンコーディングを使用する必要があります。テキストファイルのコンテンツがASCIIポイントの下半分(0-127など)内の文字のみに制限されている場合、テキストファイルにどのエンコーディングを選択するかはほとんど問題になりません。通常、デフォルトで十分です。ただし、テキストファイルにUnicodeまたは127を超える文字を含めることができる場合は、開発者がエンコーディングを知る必要があります。間違ったエンコーディングが指定されている場合、テキストが期待どおりにインポートされず、エラーがスローされない可能性があります。厄介な詳細については、この問題についてJoelSpolskyを紹介します。
schema.ini
から選択 およびMSysIMEX***
テーブル
次の記事でわかるように、どちらの方法でも機能がかなり重複しています。したがって、どちらを使用するかを選択できる場合があります。主な違いは、スキーマをアプリケーション内に保存するか、テキストファイルが必要なフォルダー内に保存するかということです。 schema.ini
を使用する場合 ファイルの場合、テキストファイルは特定のフォルダにあり、特定の名前が付けられていると想定しています。
MSysIMEX ***
を使用 、定義された仕様を参照するだけで、どこからでも任意のテキストファイルを処理できます。ただし、Accessの外部で仕様を編集するのは簡単ではありません。 Access内でも、UIを使用して仕様を微調整するのは簡単ではありません。 schema.ini
MSysIMEX ***
では直接利用できない追加機能がいくつかあります テーブル。
それでも、仕様をどこに保存するかという問題は、どちらを使用するかを決定する上で最も重要な要素になる可能性があります。
結論
日付または通貨金額を含むテキストファイルに対してスキーマ情報を定義することを強くお勧めします。日付と通貨の金額は、データの正しい解析を妨げる可能性のある地域の設定に敏感です。利用可能なオプションのセットが異なる2つの異なるシステムがあるため、次の記事でそれぞれを検討する必要があります。どちらか(または異なるテキストファイル間で両方)を使用することを選択できます。次に、 schema.ini
に目を向けます。 次の記事で。後でMSysIMEX***
を見ていきます 次の記事の表。