Страницы: 1
RSS
офф/2 можно ли получить из текстового файла (csv) sql запросом строки согласно списку номеров
 
список может содержать 100 или больше позиций.
Живи и дай жить..
 
В принципе да. Через or перечислять в запросе where. Или через and диапазон. А зачем? Мож лучше считать все и уже в эксе отфильтровать. Не приберая к запросу. Будет, наверное быстрей.  
 
96677
Я сам - дурнее всякого примера! ...
 
{quote}{login=слэн}{date=22.10.2011 10:54}{thema=офф/2  можно ли получить из текстового файла (csv) sql запросом строки согласно списку номеров}{post}список может содержать 100 или больше позиций.{/post}{/quote}  
В принципе это сделать можно, алгоритм такой, делаем временную таблицу, в которой имитируем счетчик, затем уже отбираем согласно счетчика, есть одно условие,поле по которому формируется счетчик, должно быть уникальным.  
вот пример такого запроса:  
Исходные данные: таблица - Price, поля - idTovar (уникальное), IdGroup  
выводим 10  и 20 запись  
 
SELECT a.[cnt], a.[idTovar]
FROM (SELECT DCount("idTovar","Price"," idTovar<=" & CStr([idTovar])) AS cnt, Price.idTovar
FROM Price  
ORDER BY Price.idTovar) as a  
WHERE a.[cnt]="10" or a.[cnt]="20"
 
но конечно проще считать в массив и выбросить нужные строки
Спасибо
 
проблема в том, что строк более миллиона и список более 100  
 
все просто в память может не влезть, и перечислять через or 100 номеров некул :(
 
можно пояснить для несведущих создание временной таблицы  
 
т.е. вот эту конструкию:  
DCount("idTovar","Price"," idTovar<=" & CStr([idTovar])) AS cnt
Живи и дай жить..
 
по поводу пояснений, даже не скажу как оно работает, :) взято из FAQ  и лежит в копилке, в примере расписал на два запроса
Спасибо
 
http://www.sql.ru/faq/faq_topic.aspx?fid=214
Спасибо
 
{quote}{login=}{date=22.10.2011 12:30}{thema=}{post}проблема в том, что строк более миллиона и список более 100  
 
все просто в память может не влезть, и перечислять через or 100 номеров некул :({/post}{/quote}  
 
Может я чутка не понял вопрос?, я отбирал именно номера строк, а не определенные данные, если такие огромные данные и нужны определенные значения соответствующие значениям списка, то может попытаться левым join отобрать нужные значения, правда, для access или excel  или др. БД это без проблем , то для csv я не знаю, получиться ли соеденить два файла в одном запросе.
Спасибо
 
Я бы делал по стандартной схеме, без запроса - номера в словарь, читаем csv построчно (раз огромный), проверяем нужное поле (выбираем через Split() или Mid()) по словарю, если подошло - складываем в массив или пишем сразу в другой текст, можно разделяя табами и с расширением xls.  
Так вроде и память не напрягает - там только номера и текущие данные.  
А файл-результат потом можно обработать как угодно - в Экселе открывается как родной.  
Но небыстро на миллион, можно сходить перекурить.
 
{quote}{login=Hugo}{date=22.10.2011 01:17}{thema=}{post}Я бы делал по стандартной схеме, без запроса - номера в словарь, читаем csv построчно (раз огромный), проверяем нужное поле (выбираем через Split() или Mid()) по словарю, если подошло - складываем в массив или пишем сразу в другой текст, можно разделяя табами и с расширением xls.  
Так вроде и память не напрягает - там только номера и текущие данные.  
А файл-результат потом можно обработать как угодно - в Экселе открывается как родной.  
Но небыстро на миллион, можно сходить перекурить.{/post}{/quote}  
 
 
да так и делаю :) вопрос как раз в том - можно ли не читать ненужные данные..
 
можно сделать так.  
создать базу access, сделать связь с csv, первый столбец - номер строки, создать запрос sql, если несколько файлов - создать несколько связей и несколько запросов, все это сохранить - а уже в экселе - прописать подключение к базе аксеса и выгрузкам таблицы запроса через ado - все будет работать достаточно быстро.
 
Так нужно выбрать только строку (целиком) по её порядковому номеру?  
Т.е. взять например 100567 строку, не читая других?  
Сомневаюсь, что через запрос это будет быстрее, чем читая как текст построчно до этой строки с счётчиком.  
слэн, не померишь время, когда наладишь процесс?  
Только подключив текст как внешний источник, а не загнав сперва все данные в базу :)
 
ну я думал типа рандомного чтения:  
 
seek 123  
read  
 
но не получается
Живи и дай жить..
Страницы: 1
Наверх