Форум программистов, компьютерный форум, киберфорум
Наши страницы
VBA
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
pavel1234
0 / 0 / 0
Регистрация: 26.03.2014
Сообщений: 4
1

Как заполнить базу данных на Mac

22.07.2014, 17:59. Просмотров 636. Ответов 6
Метки нет (Все метки)

Всем привет!

Исходные данные
Есть много файлов с таблицами. Эти таблицы нужно перенести в БД на SQLite. Работаю под маком, что накладывает сильные ограничения. В качестве драйвера для работы с БД использую драйвер от Actual Technologies.

Получать данные из БД с помощью QueryTables просто. Но как их туда записывать? Я сам пробовал вариант с циклом, в котором есть QueryTables.Add, но, во-первых, мне кажется нерациональным создавать QueryTable ради каждой строки, а во-вторых, работает плохо, вызывает ошибку General ODBC Error 1004 (предполагаю, что происходит из-за того, что новый запрос на запись отправляется, пока выполняется предыдущий, но могу ошибаться).

Как лучше поступить в таком случае? Может быть, вообще можно обойтись без QueryTables? Но ADO под маком нет.

Спасибо!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.07.2014, 17:59
Ответы с готовыми решениями:

Как заполнить базу данных Access с помощью vba в том же access и считать из нее инфу?
Прошу помочь в азах. Как заполнить базу данных Access с помощью vba в том же access и считать из...

Как создать сетевую базу данных на Delphi для MAC OC?
Как создать сетевую базу данных на Delphi для MAC OC?

БД для чайников как заполнить базу данных
Здравствуйте, я решил освоить базы данных и попутно использовать какуюнибудь базу данных для своей...

Заполнить базу данных
Создать таблицу данных не проблема, если уже хоть что-то понимаешь в этом. Другое дело надо...

Заполнить базу данных 20 записями
Открыть базу gek.dbf и изучить ее структуру. Заполнить базу данных 20 записями. После заполнения...

6
mc-black
2765 / 699 / 104
Регистрация: 04.02.2011
Сообщений: 1,427
22.07.2014, 18:34 2
А VBA под маком есть? Слышал, что MS планировала исключить VBA из новых версий Офис под Mac. Файлы с таблицами в каком формате?
0
pavel1234
0 / 0 / 0
Регистрация: 26.03.2014
Сообщений: 4
23.07.2014, 10:52  [ТС] 3
Конечно есть :-) Я же на форуме VBA и пишу.

Файлы с таблицами – обычные .xls.
0
Hedge-Hog
81 / 18 / 1
Регистрация: 22.05.2013
Сообщений: 32
23.07.2014, 17:24 4

Не по теме:

Есть скрипт на Python3 (Добрый админ, не сердись за offtop) :tomatos:

Переносит данные из txt (semicolon delimited) в SQLite
В первой строке - название колонок.
Сначала анализируются первые несколько строк - определяется тип данных для каждой колонки
Создаётся таблица в SQLite
Перегоняется по 50 записей

Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
 
import sys
import os
import sqlite3
 
def readToDb(dbPath, tableFilePath, delim=';'):
  chk1 = os.path.isfile(tableFilePath)
  chk2 = os.path.isfile(dbPath)
 
  if chk1: # есть оба файла
    tableNameArr = os.path.split(tableFilePath)[-1].split('.')
    if len(tableNameArr) > 1:
      tableName = ''.join(tableNameArr[0:-1])
    else:
      tableName = tableNameArr[0]
    tableName = tableName.replace(' ', '_')
 
    # создаём подключение к БД (даже если файла нет)
    conn = sqlite3.connect(dbPath)
    c = conn.cursor()
 
    with open(tableFilePath, 'r') as file:
      # первый заход - анализ данных
      rowNum = 0
      colNamesLst = []  # список колонок
      digitSet = set('0123456789.-')
      alphanumSet = set('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_.0123456789-+"\\\/')
      for line in file: # бежим по первым нескольким строкам файла
        rowNum += 1
        lineArr = line.replace('\n','').split(delim)          # "как есть"
        lineArrClr = [el.replace('"','') for el in lineArr] # без кавычек
 
        if rowNum == 1:
          colNames = dict()
          for el in lineArrClr:
            colName = str(el)
            colName = colName.replace(' ', '_') # замена пробелов в именах колонок
            colNamesLst.append(colName)       # имена столбцов по-порядку
            if colNames.get(colName) == None: # если нет колонки с таким именем
              colNames[colName] = dict() # создаём с пустым словарём типов значений
 
        if rowNum > 1: # для второй и последующих строк
          cnt1 = -1
          for el in lineArr: # перебор элеметов текущей строки
            cnt1 += 1
            key = str(el) # явное приведение к тексту
            colName = colNamesLst[cnt1]
            tmpDict = colNames[colName]
            # пытаемся определить тип данных
            if key != '' and set(key).issubset(digitSet):
              if '.' in key:
                typeName = 'real'
              else:
                typeName = 'integer'
            elif '"' in key:
              typeName = 'text'
            elif ':' in key:
              typeName = 'date'
            elif '"' in key:
              typeName = 'text'
            elif key != '' and set(key).issubset(alphanumSet):
              typeName = 'text'
            else: # для остальных типов
              typeName = 'none'
 
            if tmpDict.get(typeName): # есть такой тип в словаре
              tmpDict[typeName] = tmpDict[typeName] + 1
            else: # такого типа нет - создаём
              tmpDict[typeName] = 1
 
            colNames[colName] = tmpDict # пишем словарь обратно
 
        if rowNum > 300: # для определения формата данных используем только первые 300 строк
          break
 
 
    # в этой точке знаем тип данных - осталось выбрать самый часто встречающийся
    tableFields = []       # список полей таблицы с типами
    colTypes = []          # типы данных для будущего конвертора
    correctedColTypes = [] # типы данных для строки создания таблицы
    for colName in colNamesLst:
      tmpDict = colNames[colName] # словарь с частотами
      maxFreq = 0
      maxTypeName = ''
      for (typeName, freq) in tmpDict.items():
        if freq > maxFreq:
          maxFreq = freq
          maxTypeName = typeName
      # в этой точке известен самый часто встречающийся тип
      if 'text' in tmpDict.keys():
        maxTypeName = 'text'
      colTypes.append(maxTypeName)
 
      if maxTypeName == 'date':
        maxTypeName = 'text' # теоретически, можно навесить конвертор
      elif maxTypeName == 'none':
        maxTypeName = 'text'
      else:
        pass
 
      correctedColTypes.append(maxTypeName) # добавляем "исправленное" поле
      tableFields.append('[' + colName + '] ' + maxTypeName) # добавляем поле с описанием
 
    # создаём таблицу, если её не было
    c.execute('create table if not exists ' + tableName + ' (' + ', '.join(tableFields) + ')')
    conn.commit()
    c.execute('delete from ' + tableName) # чистим данные в таблице
    conn.commit()
    # в этой точке существует или создана таблица
 
    # читаем остальные строки в БД
    # commit каждые n записей + после прочтения всех строк (контрольный)
    with open(tableFilePath, 'r') as file:
      # первый заход - анализ данных
      rowNum = 0
      qnMarks = ', '.join(['?' for i in range(0, len(colNamesLst))]) # для insert'а
      recordList = []
 
      for line in file: # цикл по файлу
        rowNum += 1
        lineArr = line.replace('\n','').split(delim)          # "как есть"
        lineArrClr = [el.replace('"','') for el in lineArr] # без кавычек
 
        if rowNum > 1:
          for colNum in range(0, len(lineArrClr)): # перебор номеров столбцов
            value = lineArrClr[colNum] # значение в текущей строке
            if colTypes[colNum] in ('date', 'text', 'none'):
              lineArrClr[colNum] = str(value)
            elif colTypes[colNum] == 'real':
              if value == '' or value == None:
                lineArrClr[colNum] = 0
              else:
                lineArrClr[colNum] = float(value)
            elif colTypes[colNum] == 'integer':
              if value == '' or value == None:
                lineArrClr[colNum] = 0
              else:
                lineArrClr[colNum] = int(value)
 
          record = tuple(lineArrClr)
          recordList.append(record)
          if rowNum % 50 == 0: # с шагом 50 записей
            c.executemany('insert into ' + tableName + ' (' + ', '.join(colNamesLst) + ') values ('+ qnMarks +')', recordList)
            recordList = [] # чистим буфер
 
        if rowNum % 500 == 0:
          #conn.commit()
          pass
        if rowNum % 100000 == 0:
          # conn.commit()
          # break # выходим из цикла
          print('Обработано', str(rowNum), 'строк')
      if len(recordList) > 0:
        c.executemany('insert into ' + tableName + ' (' + ', '.join(colNamesLst) + ') values ('+ qnMarks +')', recordList)
 
      conn.commit() # финальный (на всякий пожарный)
      print('_______________________________________________')
      print('Всего обработано', str(rowNum), 'строк')
 
  else:
    print('Не удалось открыть файл или БД')
 
 
if __name__ != '__main__':
  args = sys.argv
  if len(args) == 3:
    dbPath = args[1]
    tableFilePath  = args[2]
    readToDb(dbPath, tableFilePath)
  elif len(args) >= 4:
    dbPath = args[1]
    tableFilePath  = args[2]
    colDelim  = args[3]
    readToDb(dbPath, tableFilePath, colDelim)
  else:
    print('Задано неверное количество аргументов')
else:
  dbPath = 'D:\\Users\\User\\Desktop\\Текучка\\temp.db'
  tableFilePath  = 'D:\\Users\\User\\Desktop\\Текучка\\somefile.txt'
  readToDb(dbPath, tableFilePath, ';')
0
pavel1234
0 / 0 / 0
Регистрация: 26.03.2014
Сообщений: 4
23.07.2014, 17:28  [ТС] 5
Это очень здорово, но мне нужно на VBA :-)
0
GooDaN
Заблокирован
23.07.2014, 22:04 6
Hedge-Hog, Говнокод!
0
Hedge-Hog
81 / 18 / 1
Регистрация: 22.05.2013
Сообщений: 32
23.07.2014, 23:02 7

Не по теме:

GooDaN, художника обидеть может каждый :) Ты человеку помоги!



Добавлено через 7 минут
pavel1234, под виндой пользую этот драйвер. Там есть Маковские.
У меня под виндой только ADODB и DAO

А в чём проблема? Запросы на SELECT делать даёт? Или вообще не соединяется?
0
23.07.2014, 23:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.07.2014, 23:02

Как изменить базу данных по умолчанию или исползовать свою базу данных для администрирование
Привет всем! Создаю новый проект на asp.net но при администрирование проекта visual studio 2012...

Заполнить базу данных через php
Учусь работать с языком php и решил попробовать сделать пробную страницу с регистрацией и...

Программно создать и заполнить базу данных
Нужно программно создать и заполнить базу данных, до этого с sql не работал практически совсем....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru