Конференция "Базы" » Импорт данных в MSSQL из MS Excel [MSSQL]
 
  • Ega23 © (07.05.09 13:00) [0]
    Задача: есть много экселевских файлов. Нужно из них перегнать данные в некую локальную базу (скорее всего - MSDE), дальше будет разбивка этих данных по категориям (но с этим уже проблем нет, это я знаю как делать). Файлов - много, думаю что где-то от пары сотен до пары тысяч.

    Предполагаемое решение - подаю на сервер имя файла, далее через OpenRowSet затаскиваю в промежуточную таблицу данные. Так по каждому из файлов. После человек уже ручками бьёт их по неким категориям и как-то начинает с ними работать.

    Таким экспортом не занимался, поэтому хочу спросить: какие подводные камни? Есть ли какие-то конкретные статьи по работе MSSQL - Excel? Оптимален ли способ, который я описал (может тупо через связку Excel -> OLE -> Delphi -> ADO -> MSSQL будет проще и быстрее)?

    Да, забыл сказать. Предполагается, что будет использоваться MSSQL 2000, либо MSDE для него. Имеет ли смысл повысить до MSSQL 2005?

    Буду признателен за любые ответы или советы.
  • Медвежонок Пятачок © (07.05.09 13:06) [1]
    (может тупо через связку Excel -> OLE -> Delphi -> ADO -> MSSQL будет проще и быстрее)?

    через связку Excel -> ADO(Delphi) -> MSSQL
  • Медвежонок Пятачок © (07.05.09 13:07) [2]
    Либо исключить еще и Delphi
  • Раиса © (07.05.09 13:11) [3]
    Медвежонок Пятачок ©   (07.05.09 13:07) [2]
    Имеется в виду написать DTS-пакет?
  • Медвежонок Пятачок © (07.05.09 13:15) [4]
    Ну в общем да, хотя дтс это уже устаревшее.
    В общем открыть книгу средствами адо либо в delphi либо прямо на сервере.
    Без оле автоматизации ёкселя.
  • Ega23 © (07.05.09 13:23) [5]

    > В общем открыть книгу средствами адо либо в delphi либо
    > прямо на сервере.


    Ну так а это разве не есть тот самый OpenRowSet?
  • Медвежонок Пятачок © (07.05.09 13:27) [6]
    ну он и есть.
    правда если учесть что
    подаю на сервер имя файла

    то ясно, что этим наверное будет заниматься свое приложение.
    то есть оно будет.
    тогда пусть уж оно и открывает книгу само.
  • sniknik © (07.05.09 13:28) [7]
    прочитать эксель как таблицу или сделать например insert into mssql select * from excel это фигня.
    главная проблема в том что в excel данные набивает человек, и excel ему позволяет это делать в произвольном порядке, не контролируя чтобы в цифрах были цифры,  в датах даты, и чтобы определенные данные лежали в определенных ячейках.
  • Ega23 © (07.05.09 13:34) [8]

    > прочитать эксель как таблицу или сделать например insert
    > into mssql select * from excel это фигня.
    > главная проблема в том что в excel данные набивает человек,
    >  и excel ему позволяет это делать в произвольном порядке,
    >  не контролируя чтобы в цифрах были цифры,  в датах даты,
    >  и чтобы определенные данные лежали в определенных ячейках.
    >


    Не-не, там сам файл программой генерится по некоему шаблону. Так что сам файл - правильный.
    Коля, а я же могу в select * from excel как-то указать, что начинать надо, допустим, с пятого ряда и до конца? Там просто первые 4 строки - некая шапка, к данным отношения не имеющая. Грубо говоря, есть набор прайс-листов, нужно их загрузить в БД и анализ проделать.
  • Игорь Шевченко © (07.05.09 13:36) [9]

    > Грубо говоря, есть набор прайс-листов, нужно их загрузить
    > в БД и анализ проделать.


    поищи готовое, мой тебе совет
  • Медвежонок Пятачок © (07.05.09 13:39) [10]
    как-то указать, что начинать надо, допустим, с пятого ряда

    Решал аналогичную задачу.
    Сначала традиционно начал мутить "настройки импорта" так как файл мог быть произвольным.
    Потом взвесив все за и против, отказался от затеи.
    Написал ппросто интеллектуальный испорт без настроек вообще из вообще любого ёкселя.

    по итогу объем кода вышел на порядок меньше чем если бы :
    были зарзарботаны структуры хранения натроек
    графический редактор настроек
    текстовые спецификации-требования к оформлению файла
  • Ega23 © (07.05.09 13:40) [11]

    > поищи готовое, мой тебе совет


    Сильно подозреваю, что готовое в данной ситуации - не пойдёт. Не тот масштаб задач. Основная задача - не данные перегнать, а последующий их анализ. Перегнать - фигня, я собственно спросил, пока у меня тут всякий софт ставится.
  • Ega23 © (07.05.09 13:42) [12]

    > Написал ппросто интеллектуальный испорт без настроек вообще
    > из вообще любого ёкселя.


    Ну дык эта... Ты не хвастайся, ты делись, если оно не секретное..  :)
    На самом деле файлы имеют абсолютно четкую структуру, единственное различие - в одном может быть 5 строк (значащих), а в другом может быть 2000.
  • Медвежонок Пятачок © (07.05.09 13:43) [13]
    По пятой строке простой выход может быть таким:
    потребовать в книге оформить диапазон интересующих ячеек в виде именованного
    тогда просто будет select * from [name] куда попадут только нужные данные.
    либо писать AI (это не так много на самом деле. Ну десять строк кода)
  • Медвежонок Пятачок © (07.05.09 13:48) [14]
    Да ничего секретного.
    В моем случае данных в книге много, но мне нужны только счет + сумма

    Делаю селект всего листа.
    Шагаю сверху вниз/слева направо. Ищу первую строку, в которой в одной из ячеек есть нечто похожее на счет (регулярками).
    Нашел первую строку и индекс колонки со счетом.
    Далее сканирую поля строки и ищу сумму, помня, что она может быть в разных форматах (снова регулярки)
    Ну типа и все.
    Далее шагаю вниз пока не кончатся счета.

    Ну и что бы не было мучительно больно, код структурирован.
    Перебор строк - одна процедура в параметрах которой каллбак.
    каллбаков много под разные цели.
  • sniknik © (07.05.09 14:00) [15]
    > указать, что начинать надо, допустим, с пятого ряда и до конца?
    нет такого, не знаю.
    ну, например тогда сделать не в один запрос а в 2, сначала во временную таблицу у которой одно дополнительно поле автоинкремент после с него обрезая как нужно в ту что нужна.
  • Ega23 © (07.05.09 14:53) [16]

    > нет такого, не знаю.


    ОК, всем спасибо! Пока больше вопросов нет.
 
Конференция "Базы" » Импорт данных в MSSQL из MS Excel [MSSQL]
Есть новые Нет новых   [134473   +33][b:0][p:0.001]