Xpoint
   [напомнить пароль]

чтение больших текстовых файлов в MSSQL2000

Метки: [без меток]
2006-12-07 10:52:10 [обр] Top manager(0/2)[досье]

Люди, у меня есть файлы по 75 мег каждый. все в формате CSV. Нужно взять из них некоторые данные. Мрожно было бы проимпортировать их, но это очень долго. А можно прочитать

select * from openrowset('DTSFlatFile'
, 'Data Source=c:\temp\ist.txt
;Mode=1;Row Delimiter={LF};File Format=1;Column Delimiter=   ;File Type=1;Skip Rows=0;First Row Column Name=False'
,'SELECT * ')

типа этого, но этот не работает, это так для примера.

Я перепробывал массу способов - не получается, либо читает и показывает не столбцы а вообще взякую фигню или вообще не читает выходит ошибка.

Есть у кого нить действенный способ чтения текстовых файлов с помощь T-SQL?

спустя 3 дня [обр] Top manager(0/2)[досье]
Можно конечно просто промпортировать файл в БД, при условии если количество и типы столбцов татично. А если нет?!
Также, процесс масс-импорта MSSQL не контролируем. Если произошла ошибка - неизвестно, по какой причине, можно тока отслеживать, изменилось ли состояния пункта назначения (таблицы для файла) или нет.
спустя 1 час 25 минут [обр] Top manager(0/2)[досье]
Вот некоторые(!) варианты которые пробывал
--select * from OpenRowset('MSDASQL', 'Driver={Microsoft Text Driver (*.txt; *.csv)}; DefaultDir=c:\TEMP;','select * from prague_small.txt') 
--SELECT * FROM OPENROWSET(BULK N'C:\temp\prague_small.txt', SINGLE_BLOB) AS Document
--select * from openrowset('DTSFlatFile', 'Data Source=c:\temp\prague_small.txt;Mode=Read;Row Delimiter={LF};File Format=0;Column Delimiter=   ;File Type=1;Skip Rows=0;First Row Column Name=False;Number of Column=0;Max characters per delimited column=255','SELECT * ')
--SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','Text;Database=C:\temp','SELECT * FROM prague_small.txt') 
--select * from OpenRowset('Microsoft.Jet.OLEDB.4.0','Text;HDR=NO;Database=C:\temp',prague_small#txt) T
--select * FROM OpenRowset('Microsoft.Jet.OLEDB.4.0','TEXT;HDR=NO;Database=C:\temp;IMEX=4;',prague_small#txt.txt) t
--select * from OPENROWSET ('MSDASQL', 'Driver={Microsoft Text Driver (*.txt; *.csv)};DefaultDir=C:\TEMP\;','select * from [prague_small.txt]')
--SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','Excel 8.0;Database=C:\TEMP\prague_small.txt;','SELECT * FROM [prague_small$]')
спустя 3 часа 29 минут [обр] Алексей Рюмин aka Dwarf(120/864)[досье]
BCP или BULK INSERT во временную таблицу, из нее уже то, что нужно.
спустя 9 минут [обр] Top manager(0/2)[досье]
Алексей Рюмин aka Dwarf[досье] не плохой вариант, но не пойдёт, особенно если файл бо 70 метров и количетсов коолонок около 30
Ну да ладно, это не самая большая проблема BCP(BULK INSERT): проблема этих функций в том, что они вылетают как только им попадается строка имеющая не все столбцы, а именно если число значений разделённых через разделичель, меньше нужного. Так что вариант не подходит.
спустя 2 часа 24 минуты [обр] Кирилл [Kirk] Королев(121/673)[досье]
BCP. Делайте временную таблицу с nullable-полями и импортируйте в нее.
спустя 15 часов [обр] Top manager(0/2)[досье]
Кирилл [Kirk] Королев[досье] - Дежавю... :)
Имеено на таковой таблице я и делал - испытывал, т.к. точно так же полагал, что такие поля должны быть NULL, но походу не сработало.
спустя 4 часа 44 минуты [обр] Алексей Рюмин aka Dwarf(120/864)[досье]

Top manager[досье] Это проблемы не MS SQL, а того, кто этот файл сделал. Чудес не бывает...

aaa,bbb,ccc
ddd,eee,fff
ggg,hhh

- в какие столбцы вставлять данные из последней строки?
Вот так все понятно, куда и чего:

ggg,,hhh

Ну и поскольку Bulk copy operations не логируются, то для вставки быстрее ничего нет.

спустя 2 дня 3 часа [обр] Top manager(0/2)[досье]
Алексей Рюмин aka Dwarf[досье] во-во и я о том же. файл ещё есть, а вот ответа нет...
Powered by POEM™ Engine Copyright © 2002-2005