アプリケーションにインポート機能を提供して、ユーザーが基本的な開始データをアプリケーションに入力できるようにします。インポートするデータをどのように作成するか、または実際に私が提供するインポート仕様に準拠しているかどうかを制御することはできません(これまでのベータテストの経験で十分に実証されています)。また、予想よりもはるかに大きいデータセット(これまでの最大は750,000レコード)をインポートしていることもわかったため、インポートを適切に実行する必要があります。
インポートするデータセットは4列から24列まで、5つまたは6つあります。私は、最も単純なデータセットから始めて、それらすべてに使用できる方法を考え出そうとしています。
この最も単純なインポートファイルは、ヘッダーのない4列のcsvファイルであり、次のようなフィールドを持つ一時的なAccessテーブルになります。
GenID: text (up to 255 chars)
Surname: text (up to 255 chars)
GivenNames: text (up to 255 chars)
OtherInfo: multi-line memo (as long as they want)
データは一時テーブルにインポートする必要があります。ここで検証が実行されてから、最終的なホームの既存のデータに追加されます。
私は最初に、保存されたインポート仕様でdocmd.transfertextを使用しようとしましたが、これは機能しますが、最小のインポートファイル以外では非常に遅くなります。(徹底的にテストしていないため、以下の2番目の方法で説明するのと同じ欠陥のいくつかが表示されないことを誓うことはできません)。
私が試した次の方法は、https://stackoverflow.com/a/11147920/1943174のアプローチに基づいていますが、Xmlを使用してインポートを実行するときに期待する正確な動作に関するドキュメントを見つけるのに苦労しました仕様をインポートするか、XML構文で使用する必要があります。
VBAでインポート仕様を作成して実行します。strFilePathは、インポートされるcsvファイルを識別し、strTableNameは、インポートに使用される一時テーブルを識別します。
Dim strXML As String
strXML = ""
strXML = strXML & "<?xml version=""1.0"" encoding=""utf-8"" ?>" & vbCrLf
strXML = strXML & "<ImportExportSpecification Path=" & Chr(34) & strFilePath & Chr(34) & " xmlns=""urn:www.microsoft.com/office/access/imexspec"">" & vbCrLf
strXML = strXML & " <ImportText TextFormat=""Delimited"" FirstRowHasNames=""false"" FieldDelimiter="","" CodePage=""437"" Destination=" & Chr(34) & strTableName & Chr(34) & " >" & vbCrLf
strXML = strXML & " <DateFormat DateOrder=""DMY"" DateDelimiter=""/"" TimeDelimiter="":"" FourYearDates=""true"" DatesLeadingZeros=""false"" />" & vbCrLf
strXML = strXML & " <NumberFormat DecimalSymbol=""."" />" & vbCrLf
strXML = strXML & " <Columns PrimaryKey=""{none}"">" & vbCrLf
strXML = strXML & " <Column Name=""Col1"" FieldName=""GenID"" Indexed=""NO"" SkipColumn=""false"" DataType=""Text"" />" & vbCrLf
strXML = strXML & " <Column Name=""Col2"" FieldName=""Surname"" Indexed=""NO"" SkipColumn=""false"" DataType=""Text"" />" & vbCrLf
strXML = strXML & " <Column Name=""Col3"" FieldName=""GivenNames"" Indexed=""NO"" SkipColumn=""false"" DataType=""Text"" />" & vbCrLf
strXML = strXML & " <Column Name=""Col4"" FieldName=""OtherInfo"" Indexed=""NO"" SkipColumn=""false"" DataType=""Memo"" />" & vbCrLf
strXML = strXML & " </Columns>" & vbCrLf
strXML = strXML & " </ImportText>" & vbCrLf
strXML = strXML & "</ImportExportSpecification>"
CurrentProject.ImportExportSpecifications.Add "MyImportSpec", strXML 'Add it to the project
DoCmd.RunSavedImportExport "MyImportSpec"'Run it
インポートは非常に高速で、使用しているテスト入力データは正しく形成されていますが、結果は正しい構造のAccessテーブルになりますが、データは間違ったフィールドにインポートされます。
GenID -- in the right place
GivenNames -- in the Other Info (memo) field
OtherInfo -- in the Surname (text) field
Surname -- in the Given Names (field).
インポートファイルの列の順序をアルファベット順に変更すると(GenID、GivenNames、OtherInfo、Surname)、インポートは正しく機能しますが、その順序はユーザーにとって意味がないか、簡単ではありません。生成されるため、インポートファイルに誤って入力される可能性があります。(さらに、これから説明する欠陥のために失敗します)。
一時テーブルに作成されたフィールドの名前をXA、XB、XC、XDに変更すると(インポート後にフィールド名を変更する予定です。データが検証され、最終的なホームとなるテーブルが追加されたら)右のデータは「右」フィールドに入力されますが、インポートファイルに正確に4つの列がある場合に限ります。5番目が存在する場合、次のフィールドが表示されます。
Field5 -- contains GenID data
XA -- contains Surname
XB -- contains GivenNames
XC -- contains OtherInfo
XD -- contains the data that was in the 5th column in the import file
インポートで新しいテーブルを作成するのではなく、インポートしたデータを正しい構造で既存の(空の)テーブルに追加した場合にも、同じ問題が発生します。
これをどのように機能させることができるか、またはユーザーが最後に無関係な列を含まないことを保証できない大規模なインポートcsvデータセットのテキストおよび複数行のメモフィールドの迅速なインポートを処理する他のアプローチについての提案はありますか?インポートcsvを編集する機能がありません。すべてのデータ変更はAccess内で行われる必要があり、csvファイルは変更されずにプロセスを通過する必要があります。
このアップデートは、Blindingly Obviousの部門によって提供されました:
インポートしたフィールドに「Field1」、「Field2」などの名前を付けると、追加のフィールドはそれらの後に順番に挿入する必要があるため、追加のフィールドは問題になりません。私はまだ正しいフィールド名にインポートしたいと思います。
クエリを使用してCSVデータをインポートすることを検討してください。このクエリは、CSVファイルから最初の4列を選択します。
SELECT csv.F1, csv.F2, csv.F3, csv.F4
FROM [Text;FMT=Delimited;HDR=NO;IMEX=2;CharacterSet=437;DATABASE=C:\Users\hans\Documents].[no_field_names.csv] As csv;
そのCSVファイルにはフィールド名が含まれていないため、AccessはそれらをF1からF4として割り当てます。実際、CSVには4つ以上の列が含まれていますが、最初の4つだけが必要でした(これはあなたの状況に対応していると思います)。
クエリデザイナで同様のクエリを作成してテストする場合は、FROM
句が次のように変更される可能性があることに注意してください...
FROM (Text;FMT=Delimited;HDR=NO;IMEX=2;CharacterSet=437;DATABASE=C:\Users\hans\Documents) no_field_names.csv As csv;
...そしてそれはうまくいきません。そのため、Accessが役に立たない変更を加えるたびに、もう一度確認して修正する必要があります。
SELECT
必要なものを返すクエリを取得したら、それをINSERT
クエリに変換できます。
INSERT INTO YourTable (GenID, Surname, GivenNames, OtherInfo)
SELECT csv.F1, csv.F2, csv.F3, csv.F4
FROM [Text;FMT=Delimited;HDR=NO;IMEX=2;CharacterSet=437;DATABASE=C:\Users\hans\Documents].[no_field_names.csv] As csv;
ただし、データソースのメモフィールドがどうなるかはわかりません。クエリが正しく機能するのを妨げない場合は、少なくともこのアプローチでは、正しいフィールドを抽出して、正しい宛先フィールドに保存できるはずです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加