回答編集履歴

3

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

2022/05/26 02:46

投稿

can110
can110

スコア38233

test CHANGED
@@ -1,225 +1,113 @@
1
1
  提示された環境から考えて
2
2
 
3
-
4
-
5
3
  - `python(+pyodbc)`は64bit動作するので64bit用のODBCドライバが必要。
6
-
7
4
  - だが、64bit用のドライバは32bit版のAccess製品版またはドライバとは共存できず。
8
-
9
5
  (64bit用ドライバAccessDatabaseEngine_X64.exeのインストール時にエラーが発生する)
10
-
11
-
12
6
 
13
7
  という状況だと思います。
14
8
 
15
-
16
-
17
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) にもあるとおり
18
10
 
19
-
20
-
21
11
  0. 64bit版pythonをアンインストールして、python32bit版をインストールする
22
-
23
12
  0. 32bit版Accessをアンインストールして、64bit版ドライバをインストールする。
24
13
 
25
-
26
-
27
14
  のいずれかの方法をとるしかないと思われます。
28
-
29
15
  ちなみに方法2としては、以下のように32bit/64bit共存する手法もあるようですが、レジストリを修正する必要などもあり、あまりお勧めできません。
30
-
31
- [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)
32
-
33
-
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)
34
17
 
35
18
  以上より
36
19
 
37
-
38
-
39
20
  - 64bitOSにも32bit版VBScriptはインストールされている
40
-
41
21
  - 32bit版VBSからなら32bit版ODBC経由で.accdbに接続可能
42
-
43
-
44
22
 
45
23
  なので、私なら
46
24
 
47
-
48
-
49
25
  - VBSで.accdbからTSV形式でテキスト出力
50
-
51
26
  - pythonでTSVからデータ読込
52
-
53
-
54
27
 
55
28
  という手段をとります。
56
29
 
57
-
58
-
59
30
  #### 実行例
60
31
 
61
-
62
-
63
32
  accdb2tsv.wsf : .accdb->tsv出力するスクリプト。
64
-
65
33
  ```wsh
66
-
67
34
  <job>
68
-
69
35
  <script language="JavaScript">
70
36
 
71
-
72
-
73
37
  // .accdb -> .tsv 出力
74
-
75
38
  function main(){
76
-
77
39
  var arg = WScript.Arguments;
78
-
79
40
  if( arg.length < 3){
80
-
81
41
  return 1;
82
-
83
42
  }
84
-
85
43
  // (0) 入力.accdbファイルパス
86
-
87
44
  // (1) 出力.tsvファイルパス
88
-
89
45
  // (2) 出力SQL文 「SELECT * FROM table ORDER BY table.no;」
90
46
 
91
-
92
-
93
47
  var oAdo = new ActiveXObject("ADODB.Connection");
94
-
95
48
  oAdo.Open( "Driver={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ=" + arg(0) + ";");
96
49
 
97
-
98
-
99
50
  var oFs = new ActiveXObject( "Scripting.FileSystemObject");
100
-
101
51
  var f = oFs.OpenTextFile( arg(1), 2, true);
102
52
 
103
-
104
-
105
53
  var rs = oAdo.Execute( arg(2));
106
-
107
54
  while( !rs.Eof){
108
-
109
55
  var str = "";
110
-
111
56
  for( var i = 0; i < rs.Fields.Count; i++){
112
-
113
57
  str += rs.Fields(i);
114
-
115
58
  if( i < (rs.Fields.Count-1)) str += "\t";
116
-
117
59
  }
118
-
119
60
  f.WriteLine( str);
120
-
121
61
  rs.MoveNext();
122
-
123
62
  }
124
-
125
63
  oAdo.Close();
126
-
127
64
  f.Close();
128
-
129
65
  return 0;
130
-
131
66
  }
132
67
 
133
-
134
-
135
68
  var ret = 1;
136
-
137
69
  try{
138
-
139
70
  ret = main();
140
-
141
71
  }
142
-
143
72
  catch( e){
144
-
145
73
  WScript.Echo( "エラー:" + e.message);
146
-
147
74
  }
148
-
149
75
  WScript.Quit( ret);
150
76
 
151
-
152
-
153
77
  </script>
154
-
155
78
  </job>
156
-
157
79
  ```
158
80
 
159
-
160
-
161
81
  accdb2tsv.py :
162
-
163
82
  ```Python
164
-
165
83
  import subprocess, os
166
-
167
84
  import pandas as pd
168
85
 
169
-
170
-
171
86
  # .accdb -> .tsv に出力して pandasで読込
172
-
173
87
  # .accdb -> .tsv は WSHで行う
174
-
175
88
  def readAccdb( acc_path, tsv_path, sql_str):
176
-
177
89
  wsh_exe = r'C:\\Windows\\SysWOW64\\WScript.exe' # 32bit版WSHを利用
178
-
179
90
  wsh_path = os.getcwd() + r'\accdb2tsv.wsf' # ADOにて.accdb -> .tsv出力するWSH
180
-
181
91
  # .pyと同一ディレクトリに存在すること
182
-
183
92
 
184
-
185
93
  cp = subprocess.run( '%s "%s" "%s" "%s" "%s"' %( wsh_exe, wsh_path, acc_path, tsv_path, sql_str), shell=True)
186
-
187
94
  df = None
188
-
189
95
  if cp.returncode == 0:
190
-
191
96
  df = pd.read_csv(tsv_path, header=None, delimiter='\t', encoding='cp932')
192
-
193
97
  os.remove(tsv_path) # 不要なので削除
194
-
195
98
  return df
196
99
 
197
-
198
-
199
100
  acc_path = os.getcwd() + r'\test.accdb'
200
-
201
101
  tsv_path = os.getcwd() + r'\test.accdb.tsv'
202
-
203
102
  sql_str = r'SELECT * FROM t_test ORDER BY t_test.no;'
204
-
205
103
  df = readAccdb( acc_path, tsv_path, sql_str)
206
-
207
104
  print(df)
208
-
209
105
  ```
210
106
 
211
-
212
-
213
107
  結果例
214
-
215
108
  ```
216
-
217
109
  0 1
218
-
219
110
  0 1 あ
220
-
221
111
  1 2 い
222
-
223
112
  2 3 う
224
-
225
113
  ```

2

拡張子の誤記修正 \.wsh -> \.wsf

2017/06/13 10:32

投稿

can110
can110

スコア38233

test CHANGED
@@ -60,7 +60,7 @@
60
60
 
61
61
 
62
62
 
63
- accdb2tsv.wsh : .accdb->tsv出力するスクリプト。
63
+ accdb2tsv.wsf : .accdb->tsv出力するスクリプト。
64
64
 
65
65
  ```wsh
66
66
 

1

実行例を追記

2017/06/13 10:32

投稿

can110
can110

スコア38233

test CHANGED
@@ -53,3 +53,173 @@
53
53
 
54
54
 
55
55
  という手段をとります。
56
+
57
+
58
+
59
+ #### 実行例
60
+
61
+
62
+
63
+ accdb2tsv.wsh : .accdb->tsv出力するスクリプト。
64
+
65
+ ```wsh
66
+
67
+ <job>
68
+
69
+ <script language="JavaScript">
70
+
71
+
72
+
73
+ // .accdb -> .tsv 出力
74
+
75
+ function main(){
76
+
77
+ var arg = WScript.Arguments;
78
+
79
+ if( arg.length < 3){
80
+
81
+ return 1;
82
+
83
+ }
84
+
85
+ // (0) 入力.accdbファイルパス
86
+
87
+ // (1) 出力.tsvファイルパス
88
+
89
+ // (2) 出力SQL文 「SELECT * FROM table ORDER BY table.no;」
90
+
91
+
92
+
93
+ var oAdo = new ActiveXObject("ADODB.Connection");
94
+
95
+ oAdo.Open( "Driver={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ=" + arg(0) + ";");
96
+
97
+
98
+
99
+ var oFs = new ActiveXObject( "Scripting.FileSystemObject");
100
+
101
+ var f = oFs.OpenTextFile( arg(1), 2, true);
102
+
103
+
104
+
105
+ var rs = oAdo.Execute( arg(2));
106
+
107
+ while( !rs.Eof){
108
+
109
+ var str = "";
110
+
111
+ for( var i = 0; i < rs.Fields.Count; i++){
112
+
113
+ str += rs.Fields(i);
114
+
115
+ if( i < (rs.Fields.Count-1)) str += "\t";
116
+
117
+ }
118
+
119
+ f.WriteLine( str);
120
+
121
+ rs.MoveNext();
122
+
123
+ }
124
+
125
+ oAdo.Close();
126
+
127
+ f.Close();
128
+
129
+ return 0;
130
+
131
+ }
132
+
133
+
134
+
135
+ var ret = 1;
136
+
137
+ try{
138
+
139
+ ret = main();
140
+
141
+ }
142
+
143
+ catch( e){
144
+
145
+ WScript.Echo( "エラー:" + e.message);
146
+
147
+ }
148
+
149
+ WScript.Quit( ret);
150
+
151
+
152
+
153
+ </script>
154
+
155
+ </job>
156
+
157
+ ```
158
+
159
+
160
+
161
+ accdb2tsv.py :
162
+
163
+ ```Python
164
+
165
+ import subprocess, os
166
+
167
+ import pandas as pd
168
+
169
+
170
+
171
+ # .accdb -> .tsv に出力して pandasで読込
172
+
173
+ # .accdb -> .tsv は WSHで行う
174
+
175
+ def readAccdb( acc_path, tsv_path, sql_str):
176
+
177
+ wsh_exe = r'C:\\Windows\\SysWOW64\\WScript.exe' # 32bit版WSHを利用
178
+
179
+ wsh_path = os.getcwd() + r'\accdb2tsv.wsf' # ADOにて.accdb -> .tsv出力するWSH
180
+
181
+ # .pyと同一ディレクトリに存在すること
182
+
183
+
184
+
185
+ cp = subprocess.run( '%s "%s" "%s" "%s" "%s"' %( wsh_exe, wsh_path, acc_path, tsv_path, sql_str), shell=True)
186
+
187
+ df = None
188
+
189
+ if cp.returncode == 0:
190
+
191
+ df = pd.read_csv(tsv_path, header=None, delimiter='\t', encoding='cp932')
192
+
193
+ os.remove(tsv_path) # 不要なので削除
194
+
195
+ return df
196
+
197
+
198
+
199
+ acc_path = os.getcwd() + r'\test.accdb'
200
+
201
+ tsv_path = os.getcwd() + r'\test.accdb.tsv'
202
+
203
+ sql_str = r'SELECT * FROM t_test ORDER BY t_test.no;'
204
+
205
+ df = readAccdb( acc_path, tsv_path, sql_str)
206
+
207
+ print(df)
208
+
209
+ ```
210
+
211
+
212
+
213
+ 結果例
214
+
215
+ ```
216
+
217
+ 0 1
218
+
219
+ 0 1 あ
220
+
221
+ 1 2 い
222
+
223
+ 2 3 う
224
+
225
+ ```