teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

リンク先の変更にともない修正

2022/05/26 02:46

投稿

8524ba23
8524ba23

スコア38352

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-civil-3d/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 う
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

2017/06/13 10:32

投稿

8524ba23
8524ba23

スコア38352

answer CHANGED
@@ -29,7 +29,7 @@
29
29
 
30
30
  #### 実行例
31
31
 
32
- accdb2tsv.wsh : .accdb->tsv出力するスクリプト。
32
+ accdb2tsv.wsf : .accdb->tsv出力するスクリプト。
33
33
  ```wsh
34
34
  <job>
35
35
  <script language="JavaScript">

1

実行例を追記

2017/06/13 10:32

投稿

8524ba23
8524ba23

スコア38352

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
+ ```