Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 26.03.2014
Сообщений: 4

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

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

Студворк — интернет-сервис помощи студентам
Всем привет!

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

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

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

Спасибо!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.07.2014, 17:59
Ответы с готовыми решениями:

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

как заполнить базу данных
Здравствуйте Я установил mysql server, через workbench создал таблицы и связи между ними Как теперь работать с базой? Как открыть её на...

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

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

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

Не по теме:

Есть скрипт на 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
0 / 0 / 0
Регистрация: 26.03.2014
Сообщений: 4
23.07.2014, 17:28  [ТС]
Это очень здорово, но мне нужно на VBA :-)
0
Заблокирован
23.07.2014, 22:04
Hedge-Hog, Говнокод!
0
81 / 18 / 1
Регистрация: 22.05.2013
Сообщений: 32
23.07.2014, 23:02

Не по теме:

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



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

А в чём проблема? Запросы на SELECT делать даёт? Или вообще не соединяется?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.07.2014, 23:02
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru