sql >> データベース >  >> RDS >> Access

テキストファイルソースの接続文字列パラメータ

    テキストファイルソースの接続文字列パラメータ

    前回の記事では、Excelデータソースの接続文字列パラメーターについて説明しました。次に、テキストファイルに焦点を当てます。テキストファイルのスキーマを記述し、Accessで開いたりリンクしたりするときに情報を使用するには、さまざまな方法があります。 Excelスプレッドシートは構造に似ていますが、これはテキストファイルには当てはまりません。テキストファイルの構造に関するいくつかの質問に答える必要があります。

    1. 幅は区切られていますか、それとも固定ですか?
    2. 1つの列がいつ終了し、他の列がいつ開始するかをどのように判断しますか?
    3. テキストは引用されていますか?
    4. 日付と時刻をどのように解析する必要がありますか?
    5. 通貨の金額はどうですか?どのようにフォーマットする必要がありますか?

    そしておそらくもっと。 CSVは一見明確に定義されているように見えるかもしれませんが、それを掘り下げると、実際には非常に大まかに定義されています。テキストを引用するかどうか、日付をどのようにフォーマットするかについては、普遍的な合意はありません。これらすべての理由から、テキストファイルを使用するには、通常、テキストファイルの構造を説明するために何らかのスキーマ情報を使用する必要があります。スキーマ情報を保存する方法は3つあります。

    1. schema.ini ディレクトリに保存されているファイル
    2. アクセスのMSysIMEX およびMSysIMEXColumns テーブル
    3. アクセスの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

    次の点に注意してください。

    1. 接続文字列にテキストファイルを指定しませんでした。代わりにフォルダを使用しました。
    2. 名前のドットが有効な文字ではないため、「テーブル」の名前が変更されました。エルゴ、 products.csv products#csvになりました 。
    3. 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つの可能な場所で決定されます:

    1. Accessはレジストリ設定を確認します。 Office 365をインストールする場合、レジストリは次の場所にあります。
      Computer \ HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Office \ ClickToRun \ REGISTRY \ MACHINE \ Software \ Microsoft \ Office \ 16.0 \ Access Connectivity Engine \ Engines \ Text 。次の記事では、この場所を「テキストレジストリキー」と呼びます。
    2. 地域に表示される設定 Windowsのコントロールパネルのアプレット。この場所を「Windows設定」と呼びます。

    テキストファイルのエンコードに関する注意

    テキストファイルへのアクセスに使用する方法に関係なく、正しいエンコーディングを使用する必要があります。テキストファイルのコンテンツがASCIIポイントの下半分(0-127など)内の文字のみに制限されている場合、テキストファイルにどのエンコーディングを選択するかはほとんど問題になりません。通常、デフォルトで十分です。ただし、テキストファイルにUnicodeまたは127を超える文字を含めることができる場合は、開発者がエンコーディングを知る必要があります。間違ったエンコーディングが指定されている場合、テキストが期待どおりにインポートされず、エラーがスローされない可能性があります。厄介な詳細については、この問題についてJoelSpolskyを紹介します。

    schema.iniから選択 およびMSysIMEX*** テーブル

    次の記事でわかるように、どちらの方法でも機能がかなり重複しています。したがって、どちらを使用するかを選択できる場合があります。主な違いは、スキーマをアプリケーション内に保存するか、テキストファイルが必要なフォルダー内に保存するかということです。 schema.iniを使用する場合 ファイルの場合、テキストファイルは特定のフォルダにあり、特定の名前が付けられていると想定しています。

    MSysIMEX ***を使用 、定義された仕様を参照するだけで、どこからでも任意のテキストファイルを処理できます。ただし、Accessの外部で仕様を編集するのは簡単ではありません。 Access内でも、UIを使用して仕様を微調整するのは簡単ではありません。 schema.ini MSysIMEX ***では直接利用できない追加機能がいくつかあります テーブル。

    それでも、仕様をどこに保存するかという問題は、どちらを使用するかを決定する上で最も重要な要素になる可能性があります。

    結論

    日付または通貨金額を含むテキストファイルに対してスキーマ情報を定義することを強くお勧めします。日付と通貨の金額は、データの正しい解析を妨げる可能性のある地域の設定に敏感です。利用可能なオプションのセットが異なる2つの異なるシステムがあるため、次の記事でそれぞれを検討する必要があります。どちらか(または異なるテキストファイル間で両方)を使用することを選択できます。次に、 schema.iniに目を向けます。 次の記事で。後でMSysIMEX***を見ていきます 次の記事の表。


    1. SQL Server REPLACE()とTRANSLATE():違いは何ですか?

    2. テーブル列の自動インクリメント

    3. ソフトウェア開発の役割の構造:データサイエンティスト

    4. PostgreSQLで値に少なくとも1桁の数字が含まれているかどうかを検出する