回答編集履歴
3
リンク先の変更にともない修正
answer
CHANGED
@@ -1,113 +1,113 @@
|
|
1
|
-
提示された環境から考えて
|
2
|
-
|
3
|
-
- `python(+pyodbc)`は64bit動作するので64bit用のODBCドライバが必要。
|
4
|
-
- だが、64bit用のドライバは32bit版のAccess製品版またはドライバとは共存できず。
|
5
|
-
(64bit用ドライバAccessDatabaseEngine_X64.exeのインストール時にエラーが発生する)
|
6
|
-
|
7
|
-
という状況だと思います。
|
8
|
-
|
9
|
-
[Possible for 64bit Python to connect with 32bit MS access driver?](https://stackoverflow.com/questions/30686550/possible-for-64bit-python-to-connect-with-32bit-ms-access-driver) にもあるとおり
|
10
|
-
|
11
|
-
0. 64bit版pythonをアンインストールして、python32bit版をインストールする
|
12
|
-
0. 32bit版Accessをアンインストールして、64bit版ドライバをインストールする。
|
13
|
-
|
14
|
-
のいずれかの方法をとるしかないと思われます。
|
15
|
-
ちなみに方法2としては、以下のように32bit/64bit共存する手法もあるようですが、レジストリを修正する必要などもあり、あまりお勧めできません。
|
16
|
-
[64 ビット版の Microsoft データベース ドライバを 32 ビット版 Microsoft Office にインストールする方法](https://knowledge.autodesk.com/ja/support/autocad
|
17
|
-
|
18
|
-
以上より
|
19
|
-
|
20
|
-
- 64bitOSにも32bit版VBScriptはインストールされている
|
21
|
-
- 32bit版VBSからなら32bit版ODBC経由で.accdbに接続可能
|
22
|
-
|
23
|
-
なので、私なら
|
24
|
-
|
25
|
-
- VBSで.accdbからTSV形式でテキスト出力
|
26
|
-
- pythonでTSVからデータ読込
|
27
|
-
|
28
|
-
という手段をとります。
|
29
|
-
|
30
|
-
#### 実行例
|
31
|
-
|
32
|
-
accdb2tsv.wsf : .accdb->tsv出力するスクリプト。
|
33
|
-
```wsh
|
34
|
-
<job>
|
35
|
-
<script language="JavaScript">
|
36
|
-
|
37
|
-
// .accdb -> .tsv 出力
|
38
|
-
function main(){
|
39
|
-
var arg = WScript.Arguments;
|
40
|
-
if( arg.length < 3){
|
41
|
-
return 1;
|
42
|
-
}
|
43
|
-
// (0) 入力.accdbファイルパス
|
44
|
-
// (1) 出力.tsvファイルパス
|
45
|
-
// (2) 出力SQL文 「SELECT * FROM table ORDER BY table.no;」
|
46
|
-
|
47
|
-
var oAdo = new ActiveXObject("ADODB.Connection");
|
48
|
-
oAdo.Open( "Driver={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ=" + arg(0) + ";");
|
49
|
-
|
50
|
-
var oFs = new ActiveXObject( "Scripting.FileSystemObject");
|
51
|
-
var f = oFs.OpenTextFile( arg(1), 2, true);
|
52
|
-
|
53
|
-
var rs = oAdo.Execute( arg(2));
|
54
|
-
while( !rs.Eof){
|
55
|
-
var str = "";
|
56
|
-
for( var i = 0; i < rs.Fields.Count; i++){
|
57
|
-
str += rs.Fields(i);
|
58
|
-
if( i < (rs.Fields.Count-1)) str += "\t";
|
59
|
-
}
|
60
|
-
f.WriteLine( str);
|
61
|
-
rs.MoveNext();
|
62
|
-
}
|
63
|
-
oAdo.Close();
|
64
|
-
f.Close();
|
65
|
-
return 0;
|
66
|
-
}
|
67
|
-
|
68
|
-
var ret = 1;
|
69
|
-
try{
|
70
|
-
ret = main();
|
71
|
-
}
|
72
|
-
catch( e){
|
73
|
-
WScript.Echo( "エラー:" + e.message);
|
74
|
-
}
|
75
|
-
WScript.Quit( ret);
|
76
|
-
|
77
|
-
</script>
|
78
|
-
</job>
|
79
|
-
```
|
80
|
-
|
81
|
-
accdb2tsv.py :
|
82
|
-
```Python
|
83
|
-
import subprocess, os
|
84
|
-
import pandas as pd
|
85
|
-
|
86
|
-
# .accdb -> .tsv に出力して pandasで読込
|
87
|
-
# .accdb -> .tsv は WSHで行う
|
88
|
-
def readAccdb( acc_path, tsv_path, sql_str):
|
89
|
-
wsh_exe = r'C:\\Windows\\SysWOW64\\WScript.exe' # 32bit版WSHを利用
|
90
|
-
wsh_path = os.getcwd() + r'\accdb2tsv.wsf' # ADOにて.accdb -> .tsv出力するWSH
|
91
|
-
# .pyと同一ディレクトリに存在すること
|
92
|
-
|
93
|
-
cp = subprocess.run( '%s "%s" "%s" "%s" "%s"' %( wsh_exe, wsh_path, acc_path, tsv_path, sql_str), shell=True)
|
94
|
-
df = None
|
95
|
-
if cp.returncode == 0:
|
96
|
-
df = pd.read_csv(tsv_path, header=None, delimiter='\t', encoding='cp932')
|
97
|
-
os.remove(tsv_path) # 不要なので削除
|
98
|
-
return df
|
99
|
-
|
100
|
-
acc_path = os.getcwd() + r'\test.accdb'
|
101
|
-
tsv_path = os.getcwd() + r'\test.accdb.tsv'
|
102
|
-
sql_str = r'SELECT * FROM t_test ORDER BY t_test.no;'
|
103
|
-
df = readAccdb( acc_path, tsv_path, sql_str)
|
104
|
-
print(df)
|
105
|
-
```
|
106
|
-
|
107
|
-
結果例
|
108
|
-
```
|
109
|
-
0 1
|
110
|
-
0 1 あ
|
111
|
-
1 2 い
|
112
|
-
2 3 う
|
1
|
+
提示された環境から考えて
|
2
|
+
|
3
|
+
- `python(+pyodbc)`は64bit動作するので64bit用のODBCドライバが必要。
|
4
|
+
- だが、64bit用のドライバは32bit版のAccess製品版またはドライバとは共存できず。
|
5
|
+
(64bit用ドライバAccessDatabaseEngine_X64.exeのインストール時にエラーが発生する)
|
6
|
+
|
7
|
+
という状況だと思います。
|
8
|
+
|
9
|
+
[Possible for 64bit Python to connect with 32bit MS access driver?](https://stackoverflow.com/questions/30686550/possible-for-64bit-python-to-connect-with-32bit-ms-access-driver) にもあるとおり
|
10
|
+
|
11
|
+
0. 64bit版pythonをアンインストールして、python32bit版をインストールする
|
12
|
+
0. 32bit版Accessをアンインストールして、64bit版ドライバをインストールする。
|
13
|
+
|
14
|
+
のいずれかの方法をとるしかないと思われます。
|
15
|
+
ちなみに方法2としては、以下のように32bit/64bit共存する手法もあるようですが、レジストリを修正する必要などもあり、あまりお勧めできません。
|
16
|
+
[64 ビット版の Microsoft データベース ドライバを 32 ビット版 Microsoft Office にインストールする方法](https://knowledge.autodesk.com/ja/support/autocad/learn-explore/caas/sfdcarticles/sfdcarticles/JPN/How-to-install-64-bit-Microsoft-Database-Drivers-alongside-32-bit-Microsoft-Office.html)
|
17
|
+
|
18
|
+
以上より
|
19
|
+
|
20
|
+
- 64bitOSにも32bit版VBScriptはインストールされている
|
21
|
+
- 32bit版VBSからなら32bit版ODBC経由で.accdbに接続可能
|
22
|
+
|
23
|
+
なので、私なら
|
24
|
+
|
25
|
+
- VBSで.accdbからTSV形式でテキスト出力
|
26
|
+
- pythonでTSVからデータ読込
|
27
|
+
|
28
|
+
という手段をとります。
|
29
|
+
|
30
|
+
#### 実行例
|
31
|
+
|
32
|
+
accdb2tsv.wsf : .accdb->tsv出力するスクリプト。
|
33
|
+
```wsh
|
34
|
+
<job>
|
35
|
+
<script language="JavaScript">
|
36
|
+
|
37
|
+
// .accdb -> .tsv 出力
|
38
|
+
function main(){
|
39
|
+
var arg = WScript.Arguments;
|
40
|
+
if( arg.length < 3){
|
41
|
+
return 1;
|
42
|
+
}
|
43
|
+
// (0) 入力.accdbファイルパス
|
44
|
+
// (1) 出力.tsvファイルパス
|
45
|
+
// (2) 出力SQL文 「SELECT * FROM table ORDER BY table.no;」
|
46
|
+
|
47
|
+
var oAdo = new ActiveXObject("ADODB.Connection");
|
48
|
+
oAdo.Open( "Driver={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ=" + arg(0) + ";");
|
49
|
+
|
50
|
+
var oFs = new ActiveXObject( "Scripting.FileSystemObject");
|
51
|
+
var f = oFs.OpenTextFile( arg(1), 2, true);
|
52
|
+
|
53
|
+
var rs = oAdo.Execute( arg(2));
|
54
|
+
while( !rs.Eof){
|
55
|
+
var str = "";
|
56
|
+
for( var i = 0; i < rs.Fields.Count; i++){
|
57
|
+
str += rs.Fields(i);
|
58
|
+
if( i < (rs.Fields.Count-1)) str += "\t";
|
59
|
+
}
|
60
|
+
f.WriteLine( str);
|
61
|
+
rs.MoveNext();
|
62
|
+
}
|
63
|
+
oAdo.Close();
|
64
|
+
f.Close();
|
65
|
+
return 0;
|
66
|
+
}
|
67
|
+
|
68
|
+
var ret = 1;
|
69
|
+
try{
|
70
|
+
ret = main();
|
71
|
+
}
|
72
|
+
catch( e){
|
73
|
+
WScript.Echo( "エラー:" + e.message);
|
74
|
+
}
|
75
|
+
WScript.Quit( ret);
|
76
|
+
|
77
|
+
</script>
|
78
|
+
</job>
|
79
|
+
```
|
80
|
+
|
81
|
+
accdb2tsv.py :
|
82
|
+
```Python
|
83
|
+
import subprocess, os
|
84
|
+
import pandas as pd
|
85
|
+
|
86
|
+
# .accdb -> .tsv に出力して pandasで読込
|
87
|
+
# .accdb -> .tsv は WSHで行う
|
88
|
+
def readAccdb( acc_path, tsv_path, sql_str):
|
89
|
+
wsh_exe = r'C:\\Windows\\SysWOW64\\WScript.exe' # 32bit版WSHを利用
|
90
|
+
wsh_path = os.getcwd() + r'\accdb2tsv.wsf' # ADOにて.accdb -> .tsv出力するWSH
|
91
|
+
# .pyと同一ディレクトリに存在すること
|
92
|
+
|
93
|
+
cp = subprocess.run( '%s "%s" "%s" "%s" "%s"' %( wsh_exe, wsh_path, acc_path, tsv_path, sql_str), shell=True)
|
94
|
+
df = None
|
95
|
+
if cp.returncode == 0:
|
96
|
+
df = pd.read_csv(tsv_path, header=None, delimiter='\t', encoding='cp932')
|
97
|
+
os.remove(tsv_path) # 不要なので削除
|
98
|
+
return df
|
99
|
+
|
100
|
+
acc_path = os.getcwd() + r'\test.accdb'
|
101
|
+
tsv_path = os.getcwd() + r'\test.accdb.tsv'
|
102
|
+
sql_str = r'SELECT * FROM t_test ORDER BY t_test.no;'
|
103
|
+
df = readAccdb( acc_path, tsv_path, sql_str)
|
104
|
+
print(df)
|
105
|
+
```
|
106
|
+
|
107
|
+
結果例
|
108
|
+
```
|
109
|
+
0 1
|
110
|
+
0 1 あ
|
111
|
+
1 2 い
|
112
|
+
2 3 う
|
113
113
|
```
|
2
拡張子の誤記修正 \.wsh -> \.wsf
answer
CHANGED
@@ -29,7 +29,7 @@
|
|
29
29
|
|
30
30
|
#### 実行例
|
31
31
|
|
32
|
-
accdb2tsv.
|
32
|
+
accdb2tsv.wsf : .accdb->tsv出力するスクリプト。
|
33
33
|
```wsh
|
34
34
|
<job>
|
35
35
|
<script language="JavaScript">
|
1
実行例を追記
answer
CHANGED
@@ -25,4 +25,89 @@
|
|
25
25
|
- VBSで.accdbからTSV形式でテキスト出力
|
26
26
|
- pythonでTSVからデータ読込
|
27
27
|
|
28
|
-
という手段をとります。
|
28
|
+
という手段をとります。
|
29
|
+
|
30
|
+
#### 実行例
|
31
|
+
|
32
|
+
accdb2tsv.wsh : .accdb->tsv出力するスクリプト。
|
33
|
+
```wsh
|
34
|
+
<job>
|
35
|
+
<script language="JavaScript">
|
36
|
+
|
37
|
+
// .accdb -> .tsv 出力
|
38
|
+
function main(){
|
39
|
+
var arg = WScript.Arguments;
|
40
|
+
if( arg.length < 3){
|
41
|
+
return 1;
|
42
|
+
}
|
43
|
+
// (0) 入力.accdbファイルパス
|
44
|
+
// (1) 出力.tsvファイルパス
|
45
|
+
// (2) 出力SQL文 「SELECT * FROM table ORDER BY table.no;」
|
46
|
+
|
47
|
+
var oAdo = new ActiveXObject("ADODB.Connection");
|
48
|
+
oAdo.Open( "Driver={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ=" + arg(0) + ";");
|
49
|
+
|
50
|
+
var oFs = new ActiveXObject( "Scripting.FileSystemObject");
|
51
|
+
var f = oFs.OpenTextFile( arg(1), 2, true);
|
52
|
+
|
53
|
+
var rs = oAdo.Execute( arg(2));
|
54
|
+
while( !rs.Eof){
|
55
|
+
var str = "";
|
56
|
+
for( var i = 0; i < rs.Fields.Count; i++){
|
57
|
+
str += rs.Fields(i);
|
58
|
+
if( i < (rs.Fields.Count-1)) str += "\t";
|
59
|
+
}
|
60
|
+
f.WriteLine( str);
|
61
|
+
rs.MoveNext();
|
62
|
+
}
|
63
|
+
oAdo.Close();
|
64
|
+
f.Close();
|
65
|
+
return 0;
|
66
|
+
}
|
67
|
+
|
68
|
+
var ret = 1;
|
69
|
+
try{
|
70
|
+
ret = main();
|
71
|
+
}
|
72
|
+
catch( e){
|
73
|
+
WScript.Echo( "エラー:" + e.message);
|
74
|
+
}
|
75
|
+
WScript.Quit( ret);
|
76
|
+
|
77
|
+
</script>
|
78
|
+
</job>
|
79
|
+
```
|
80
|
+
|
81
|
+
accdb2tsv.py :
|
82
|
+
```Python
|
83
|
+
import subprocess, os
|
84
|
+
import pandas as pd
|
85
|
+
|
86
|
+
# .accdb -> .tsv に出力して pandasで読込
|
87
|
+
# .accdb -> .tsv は WSHで行う
|
88
|
+
def readAccdb( acc_path, tsv_path, sql_str):
|
89
|
+
wsh_exe = r'C:\\Windows\\SysWOW64\\WScript.exe' # 32bit版WSHを利用
|
90
|
+
wsh_path = os.getcwd() + r'\accdb2tsv.wsf' # ADOにて.accdb -> .tsv出力するWSH
|
91
|
+
# .pyと同一ディレクトリに存在すること
|
92
|
+
|
93
|
+
cp = subprocess.run( '%s "%s" "%s" "%s" "%s"' %( wsh_exe, wsh_path, acc_path, tsv_path, sql_str), shell=True)
|
94
|
+
df = None
|
95
|
+
if cp.returncode == 0:
|
96
|
+
df = pd.read_csv(tsv_path, header=None, delimiter='\t', encoding='cp932')
|
97
|
+
os.remove(tsv_path) # 不要なので削除
|
98
|
+
return df
|
99
|
+
|
100
|
+
acc_path = os.getcwd() + r'\test.accdb'
|
101
|
+
tsv_path = os.getcwd() + r'\test.accdb.tsv'
|
102
|
+
sql_str = r'SELECT * FROM t_test ORDER BY t_test.no;'
|
103
|
+
df = readAccdb( acc_path, tsv_path, sql_str)
|
104
|
+
print(df)
|
105
|
+
```
|
106
|
+
|
107
|
+
結果例
|
108
|
+
```
|
109
|
+
0 1
|
110
|
+
0 1 あ
|
111
|
+
1 2 い
|
112
|
+
2 3 う
|
113
|
+
```
|