Модераторы: Akina

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Парсинг Excel 
V
    Опции темы
Itsys
Дата 13.3.2008, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 1
Всего: 34



Требуется импортировать данные из Excel файлов в таблицу MS SQL
В SQL таблица состоит из колонок Col1, Col2 ... Col30 тип ntext

Надо сделать импорт в эту таблицу произвольного Excel файла (структура может меняться, т.е. набор и количество колонок не постоянно) определенных колонок, т.е. не все подряд, а только допустим 3, 4 и 12 в соответствующие колонки таблицы MS SQL, т.е. 3 колонка в Col3, 4 в Col4, 12 в Col12 и начиная с определенной строки, например с 20 и до конца.

Все осложняется тем, что может быть задан произвольный фильтр парсинга, например 4 колонка больше 60, соответственно загружаются все строки, у которых значение в четвертой колонке больше 60, фильтров может быть несколько.

Второе больше не усложнение, а условие - файл Excel находится на другом сервере в сети и доступен через шару.

PS Данный механизм реализован на Perl, т.е. perl парсит Excel файл и с помошью запросов вставляет это в таблицу, но работает все это очень медлено файл Excel на 16000 строк и 20 колонок парсится около 1-2 минут. Загрузка процессора под 100%, весь отжирается памяти примерно вес файла *3 и загружается сеть, т.к. perl стоит там же, где лежит Excel - на другом сервере. Загрузку файла на 50000 строк, я так и не дождался  smile - обрубил.

ЗЫ Самый главный вопрос, если это реализовать средствами MS SQL, если это, конечно, впринципе возможно, будет ли это работать быстрее и меньше грузить процессор, память и сеть?
PM MAIL WWW Skype   Вверх
Akina
Дата 13.3.2008, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 454



А почему не реализовать это собсно средствами VBA? прямо из модулёчка в самом этом Эксельном файле?
Или, например, промежуточная ADP-шка.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Magnifico
Дата 13.3.2008, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 23.1.2008
Где: Московская област ь

Репутация: 10
Всего: 17



для 2005 open rowset
Код

Select *  From 
Openrowset('msdasql','DRIVER={Microsoft Excel Driver (*.xls)};ReadOnly=1;DefaultDir=c:\files\names.xls', 
'Select * From [sheet1$]')



--------------------
Всё  в  порядке   -   спасибо  зарядке  !
PM MAIL   Вверх
SharedNoob
Дата 13.3.2008, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 25.6.2007
Где: UA

Репутация: 2
Всего: 5



А собственно ДТС пакет не выход ?
PM MAIL ICQ Skype   Вверх
Itsys
Дата 13.3.2008, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 1
Всего: 34



Цитата(Akina @  13.3.2008,  13:42 Найти цитируемый пост)
А почему не реализовать это собсно средствами VBA? прямо из модулёчка в самом этом Эксельном файле?
Или, например, промежуточная ADP-шка. 

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


Цитата(Magnifico @  13.3.2008,  14:04 Найти цитируемый пост)
для 2005 open rowset

У нас 2000 и пока никаких причин, чтобы покупать 2005 нет, хотя это может стать причиной, вопрос в скорости работы... насколько быстро данный запрос откроет файл на 10 мегов?

Добавлено через 2 минуты и 2 секунды
Цитата(SharedNoob @  13.3.2008,  14:52 Найти цитируемый пост)
А собственно ДТС пакет не выход

Вообще не выход, т.к.

Цитата(Itsys @  13.3.2008,  13:34 Найти цитируемый пост)
Надо сделать импорт в эту таблицу произвольного Excel файла (структура может меняться, т.е. набор и количество колонок не постоянно) определенных колонок, т.е. не все подряд, а только допустим 3, 4 и 12 в соответствующие колонки таблицы MS SQL, т.е. 3 колонка в Col3, 4 в Col4, 12 в Col12 и начиная с определенной строки, например с 20 и до конца.

Какие колонки импортировать а какие нет - определяет менеджер при импорте, и файлы у всех поставщиков очень уж разные  smile 

PM MAIL WWW Skype   Вверх
Magnifico
Дата 13.3.2008, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 23.1.2008
Где: Московская област ь

Репутация: 10
Всего: 17



локальный xls  на 10,3 мега
в менеджмент студио за 23 секунды   44392 строк


--------------------
Всё  в  порядке   -   спасибо  зарядке  !
PM MAIL   Вверх
SharedNoob
Дата 13.3.2008, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 25.6.2007
Где: UA

Репутация: 2
Всего: 5



Цитата(Magnifico @ 13.3.2008,  14:04)
для 2005 open rowset
Код

Select *  From 
Openrowset('msdasql','DRIVER={Microsoft Excel Driver (*.xls)};ReadOnly=1;DefaultDir=c:\files\names.xls', 
'Select * From [sheet1$]')

Дык а чем не устраивает это ? возвращает набор данных который лежит в ексель файле .... да дальше вороти-нехачу .

Добавлено @ 15:18
ой извеняюсь, недочитал ...sql2005

Добавлено @ 15:24

ДЛЯ SQL 2000
вариант 1
Код

SELECT *
FROM OPENDATASOURCE(
'Microsoft Excel Driver (*.xls)',
'Data Source=D:\ ;'
)...[название файлла без расширения]

вариант 2
Код

SELECT  *
  FROM OPENROWSET  ('MSDASQL',
                    'Driver={Microsoft Excel Driver (*.xls)};
                     SourceDB=d:\;
                     DefaultDir=d:\;
                     SourceType=XLS;
                     Exclusive=No;
                     BackgroundFetch=Yes;
                     Collate=Russian;
                     Null=No;
                     Deleted=No;',
                     'SELECT * FROM [название файлла без расширения]')


код на работоспособность не проверял но с драйвером для DBF все пашет

Это сообщение отредактировал(а) SharedNoob - 13.3.2008, 15:27
PM MAIL ICQ Skype   Вверх
Itsys
Дата 13.3.2008, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 1
Всего: 34



А DefaultDir можно задать как \\server\files\?

Это сообщение отредактировал(а) Itsys - 13.3.2008, 15:42
PM MAIL WWW Skype   Вверх
SharedNoob
Дата 13.3.2008, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 25.6.2007
Где: UA

Репутация: 2
Всего: 5



QA => F1 => поиск по указателю => OPENDATASOURCE (или OPENROWSET) => enter
и читаем. 

ps
для начала прочитайте данные с локального компьютера, а потом можно и подключить сетевой диск если что.

Это сообщение отредактировал(а) SharedNoob - 13.3.2008, 15:54
PM MAIL ICQ Skype   Вверх
Itsys
Дата 13.3.2008, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 1
Всего: 34



Цитата(SharedNoob @  13.3.2008,  15:53 Найти цитируемый пост)
QA => F1 => поиск по указателю => OPENDATASOURCE (или OPENROWSET) => enter

До этого я сам догадался smile. Спасибо что напомнил, что есть такая функция в MS SQL (шутка). Ладно протестирую сообщу результаты.

Это сообщение отредактировал(а) Itsys - 13.3.2008, 16:09
PM MAIL WWW Skype   Вверх
Itsys
Дата 16.3.2008, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 1
Всего: 34



Код

SELECT TOP 10 * FROM OPENROWSET(
 'MSDASQL', 
 'Driver=Microsoft Excel Driver (*.xls);DBQ=\\pavlov\Files\34', 
 'SELECT * FROM [LIST$]'
) as xls


Только парсит он не правильно  smile 
В файле Excel строка:
Код

New    NUM    CISBN    IDNAME    CLARICHEV    C_SERIE    CNAME    CAUTHOR    CLONGNAME    IINPACK    IPAGETOTAL    CFORMAT    CCOVER    cSizes1    iWeight1    YPRICE    CPARTITION    CSUBPRTION    CPUBLNAME    CEAN    cComplete

А он выдает:
Код

New    NULL    CISBN    NULL    NULL    C_SERIE    CNAME    CAUTHOR    CLONGNAME    NULL    NULL    CFORMAT    CCOVER    cSizes1    NULL    NULL    CPARTITION    CSUBPRTION    CPUBLNAME    CEAN    cComplete


Почему некоторые значения изменены на NULL?
PM MAIL WWW Skype   Вверх
Magnifico
Дата 16.3.2008, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 23.1.2008
Где: Московская област ь

Репутация: 10
Всего: 17



Могут разные тиы данных в одном столбце:
1
2
3
4
5
6
7А

7A  это потенциальный нулл  - ошибка преобразования

если не принципиальны типы данных: приводить столбцы  эксель  к строке

Код

Sub ПривестиКСтроке()
    Dim temp As String
    Dim str As String
      str = "'"
    For Each c In Selection
     temp = Trim(c.Value)
    
     c.Value = str & temp
     Next c
End Sub



--------------------
Всё  в  порядке   -   спасибо  зарядке  !
PM MAIL   Вверх
Itsys
Дата 16.3.2008, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 1
Всего: 34



С Excel-ем сделать ничего не могу.... т.к.
Цитата(Itsys @  13.3.2008,  15:06 Найти цитируемый пост)
Потому-что это используется в интернет-магазине, написанном на perl, а файл Excel - это прайсы поставщиков, которые загружаются, сверяются с существующими товарами поставщика, корректируются цены и д.р. параметры товаров в магазине и добавляются новые - нет возможности добавить в Excel доп обработчики, т.к. файлы не наши, и обяснять как это делать каждому менеджеру после получения файла, собственно говоря не хочется


Есть друие предложения и варианты?

PS хотелось бы сделать все без вмешательства пользователей - получил файл по почте - загрузил в back-office интернет-магазина и все - дальше система сама все обрабатывет, менеджеру надо только подтверждать выполнение определнных действий.. smile 
PM MAIL WWW Skype   Вверх
Magnifico
Дата 17.3.2008, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 23.1.2008
Где: Московская област ь

Репутация: 10
Всего: 17



попробуй с  cast(ПОЛЕ as nvarchar(255))  поиграться

Код

select  [ЗДЕСЬ]   from openrowset(
 'MSDASQL', 
 'Driver=Microsoft Excel Driver (*.xls);DBQ=\\pavlov\Files\34', 
 'SELECT   [ИЛИ ЗДЕСЬ]  FROM [LIST$]'
) as xls



если использовать эксель в качестве источника данных ADO ,OLE то полюбому будет приводится столбец к определенному типу данных 
(которых больше в столбце) и будут ошибки преобразования.
Только банально перебирать  столбцы и строки   и приводить каждую ячейку к определн формату

для обработки грязных юзерских данных может и понадобится сложные обработчики писать и не в SQLSERVERE
да и ресурсоемкое это занятие



--------------------
Всё  в  порядке   -   спасибо  зарядке  !
PM MAIL   Вверх
Itsys
Дата 17.3.2008, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 1
Всего: 34



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

Есть ли способ CASTить все поля запроса в VARCHAR без их конкретного указания, ну типа CAST(* AS VARCHAR(5000))?
PM MAIL WWW Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




[ Время генерации скрипта: 0.0668 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.