Accessについて教えてください。
以前、Access2003使用し、新規テーブルにCSVファ...Accessについて教えてください。
以前、Access2003使用し、新規テーブルにCSVファイルをインポートさせたところ、
あるカラムの末尾入力された半角スペースが削除されてしまうとの質問をさせて頂きました。 その際に、VBで読み込むと、半角スペースは消えないと情報を頂き、ソースコードも記載していただきましたが、
カンマ区切りでフィールドに設定するためsplitでカンマ区切りにしていただきました。
しかし、DQでくくられている文字列にカンマが付与されているものも分割されてしまい
カラムがずれてしまいました。
頂いたソースを修正しましたが、VBも初心者のためうまく改修できませんでした。
再度お力をお貸し願えませんでしょうか。
以下が頂いたソースとなります。
---------------------------------------------
Sub SAMPLE_0608()
Dim DB As Database
Dim R1 As Recordset
Dim TDF As TableDef
Dim FLD As Field
Dim TABLE_NAME_1 As String
Dim CUR_FLD As String
Dim IN_FILE As String
Dim In_Data As String
Dim W1 As Long, W2 As Long
Dim V1 As Variant
Dim L1 As String
Dim FLG1 As Long
'このデータベースが置かれているフォルダのフルパスを取得します。
CUR_FLD = Left(CurrentDb.Name, InStrRev(CurrentDb.Name, "\"))
'読み込むファイルを選択します。
WizHook.Key = 51488399
W1 = WizHook.GetFileName(0, "", "", "", IN_FILE, CUR_FLD, "csvファイル(*.csv)|*.csv", 0, 0, 4, True)
WizHook.Key = 0
DoEvents
If W1 <> 0 Then
MsgBox "ファイルが選択されなかったので、処理を中止します。"
Exit Sub
End If
'ファイルを開きます。
Open IN_FILE For Input As #1
FLG1 = 0
'ファイルを取り込みます。
Set DB = CurrentDb()
Do Until EOF(1)
Line Input #1, In_Data
If FLG1 = 0 Then
TABLE_NAME_1 = "TEST_" & Format(Date, "yyyymmdd")
On Error Resume Next
DoCmd.DeleteObject acTable, TABLE_NAME_1
On Error GoTo 0
Set TDF = DB.CreateTableDef(TABLE_NAME_1)
V1 = Split(In_Data, ",")
W1 = UBound(V1) - 1
ReDim fld_name(W1) As String
For W2 = 0 To W1
fld_name(W2) = StrConv(V1(W2), 4)
Set FLD = TDF.CreateField(fld_name(W2), DB_TEXT)
'空文字列を受け入れるようにするため、1行追加
FLD.AllowZeroLength = True
TDF.Fields.Append FLD
Next W2
DB.TableDefs.Append TDF
Set R1 = DB.OpenRecordset(TABLE_NAME_1)
FLG1 = 1
Else
V1 = Split(In_Data, ",")
R1.AddNew
For W2 = 0 To W1
R1(fld_name(W2)) = V1(W2)
Next W2
R1.Update
End If
Loop
Close #1
R1.Close
End Sub無理です。
Comma-Separated Values ファイルに
ダブルクォーテーション区切りのある物と無いフォーマットが2種類存在するのは
このカンマなどの中文字として使用する上での問題があるからです。
( "," なんて文字、普段は滅多に使わないし(笑))
日本国,東,京,127767944 CRLF
"日本国","東,京","127767944" CRLF
"日本国","東京",127767944 CRLF
まずはダブルクォーテーション囲みのフォーマットのファイルを用意する所から始めましょう。
もし運用上、Access処理の前段階でフォーマット変更が物理不可だったら
どんなデータベースでも一発での自動処理は不可能です。
Webなどの場合は、1行ずつReadLineして
カンマでSplitした後に Ubound関数で配列の最大数を取りますが
Accessだったら素直に一旦、仮テーブルにインポートを掛けて
フィールド数がオーバーしたレコードだけアウトバウンズする方法が現実的かもしれません。
あと、OPEN、GET、PUTは2000年以降に Windows OSにVBscript が標準実装されてからはあまり使用しません。
(Access97の遺産を使う場合は有効ですが)
OpenTextFile して ReadLine した方が圧倒的に簡単です(笑)
Access のVBAの中で書いても良いし
Accessに縛られずメモ帳で書いて拡張子 .vbs とすればWindowsバッチとして動作しますから。
(どっちみち1.2GBを超えるファイルの場合はVBそのもので処理の遅延がありますが)