Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.81/21: Рейтинг темы: голосов - 21, средняя оценка - 4.81
0 / 0 / 0
Регистрация: 21.06.2011
Сообщений: 21
1

В файле нужно осуществлять поиск

21.06.2011, 22:56. Показов 4239. Ответов 32
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вопрос по работе с файлами.

А именно, имеется файл с данными (прайсы). В этом файле нужно осуществлять поиск (по коду товара). Файлик на 6'000'000+ (шесть с лишних лямов) позиций и размером под 300Мб в .txt формате (excel отказался переваривать такое кол-во строк).

Ситуация такова, что загрузить его целиком в string не вышло (выбило аутофмэмори), а грузить построчно (что в общем то наиболее удобно для дальнейшего парсинга) в массив ацки долго (на i3 и SATA винтом 1КК строк грузится 3 часа). Актуальность данных файла 1 день (т.е. прайс меняется каждый день).

А вопрос таков - как можно загрузить этот файлик в память и потом с ним работать из ОЗУ, либо есть ли какая возможность быстро искать непосредственно в файле и уже потом просто считывать строчку в файле с искомым вхождением?

Спасибо за ответы.
 Комментарий модератора 
Одна тема - один вопрос (Правила п.3.15)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.06.2011, 22:56
Ответы с готовыми решениями:

Как осуществлять поиск без учета регистра?
В данном кейсе осуществляется поиск, но он чувствителен к регистру букв, подскажите пожалуйста, как...

Посоветуйте, как осуществлять быстрый поиск по полям класса?
Создаю класс (допустим myClass) в котором есть несколько полей x,y,a,b,c итд. Далее создаю...

Программа производит поиск по текстовому файлу 1, нужно занулить при поиске те слова, указанные в файле 2
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data;...

Метод с возможностью осуществлять поиск файлов и папок по имени размеру, датам создания, доступа и модификации
Не могу найти подходящею функцию возможность осуществлять поиск файлов и папок по имени размеру,...

32
0 / 0 / 0
Регистрация: 21.06.2011
Сообщений: 21
24.06.2011, 16:44  [ТС] 21
Author24 — интернет-сервис помощи студентам
я понял... еще момент - в файле есть примерно 40 позиций товаров которые разбиты через "\n" на 2 строчки... в своем "мего"-парсере я игнорирую эти строки, а этот код справится с таким?..

Добавлено через 34 минуты
так же ниистово ругается на:
C#
1
adapter.Fill(dt);
отакими матами - "System.Data.OleDb.OleDbException: Data type mismatch in criteria expression."

отак ругается:
Код
System.Data.OleDb.OleDbException: Data type mismatch in criteria expression.
   в void System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)
   в Int32 System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object executeResult)
   в Int32 System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object executeResult)
   в Int32 System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object executeResult)
   в OleDbDataReader System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
   в OleDbDataReader System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior)
   в IDataReader System.Data.OleDb.OleDbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
   в Int32 System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
   в Int32 System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior)
   в Int32 System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)
   как static void autoPrice.autoPriceEngine.LoadPrice(String filePath) в d:\other\autoPrice\autoPrice\Classes.cs:строка 52
   как void autoPrice.frmMain.button1_Click(Object sender, EventArgs e) в d:\other\autoPrice\autoPrice\frmMain.cs:строка 27
   в void System.Windows.Forms.Control.OnClick(EventArgs e)
   в void System.Windows.Forms.Button.OnClick(EventArgs e)
   в void System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   в void System.Windows.Forms.Control.WmMouseUp(Message m, MouseButtons button, Int32 clicks)
   в void System.Windows.Forms.Control.WndProc(Message m)
   в void System.Windows.Forms.ButtonBase.WndProc(Message m)
   в void System.Windows.Forms.Button.WndProc(Message m)
   в void System.Windows.Forms.Control+ControlNativeWindow.OnMessage(Message m)
   в void System.Windows.Forms.Control+ControlNativeWindow.WndProc(Message m)
   в IntPtr System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
   в Boolean System.Windows.Forms.Application+ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
   в void System.Windows.Forms.Application+ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
   в void System.Windows.Forms.Application+ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
   в static void System.Windows.Forms.Application.Run(Form mainForm)
   как static void autoPrice.Program.Main() в d:\other\autoPrice\autoPrice\Program.cs:строка 17
0
512 / 298 / 37
Регистрация: 22.06.2011
Сообщений: 929
24.06.2011, 17:55 22
Ну сказано же - Data type mismatch in criteria expression
Не совпадение типов. Для текстовых полей заключай в апострафы. Поиграй с типами полей dataTable, попробуй [F2]='045005250' (в апострафах)
0
0 / 0 / 0
Регистрация: 21.06.2011
Сообщений: 21
04.08.2011, 13:48  [ТС] 23
Цитата Сообщение от Ice_and_Fire Посмотреть сообщение
Вот набросал функцию. Возвращает DataTable из текстового файла.
cmdText - это SQL-запрос к файлу (например "select * from тотФайлик.txt")
db - это полный путь к папке, где находится тотФайлик.txt

Несколько нюансов описаны по приведенной выше ссылке

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
private DataTable execCmd(string cmdText, string db)
        {
            
            using (OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + db
                       + @";Extended Properties=""text;HDR=Yes;FMT=Delimited"";"))
            {
                con.Open();
                OleDbDataAdapter adapter = new OleDbDataAdapter(cmdText, con);
                DataTable dt = new DataTable();
                adapter.Fill(dt);
                return dt;
            }   //con
        }   //execCmd
Добавлено через 10 минут
А на счет разделителей (точка с запятой,табуляция или иное) отвечает параметр "FMT=". Его значения смотрим тут http://msdn.microsoft.com/en-u... 09353.aspx
а как сделать в запросе (cmdText) выборку по полю? (вторая колонка)
0
512 / 298 / 37
Регистрация: 22.06.2011
Сообщений: 929
04.08.2011, 13:56 24
Смотри далее В файле нужно осуществлять поиск
0
0 / 0 / 0
Регистрация: 21.06.2011
Сообщений: 21
04.08.2011, 17:04  [ТС] 25
значит наваял я код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
            if(File.Exists(outputPricePath) == false)
            {
                singleThreadInfo.inProgress = false;
                return;
            }
            
            string priceCMD = "select * from " + Path.GetFileName(outputPricePath) + " where [F2] like '" + searchString[0] + "'";
            
            using (OleDbConnection priceDB = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Path.GetDirectoryName(outputPricePath) + @"\;Extended Properties=""text;HDR=Yes;FMT=Delimited"";"))
            {
                priceDB.Open();
                
                OleDbDataAdapter priceDBAdaptor = new OleDbDataAdapter(priceCMD, priceDB);
                
                DataTable priceTable = new DataTable();
                
                priceDBAdaptor.Fill(priceTable);
            }
и на priceDBAdaptor.Fill(priceTable); выдало ашипку:

текст ашипки
System.Data.OleDb.OleDbException: Cannot update. Database or object is read-only.
в void System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)
в Int32 System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object executeResult)
в Int32 System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object executeResult)
в Int32 System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object executeResult)
в OleDbDataReader System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
в OleDbDataReader System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior)
в IDataReader System.Data.OleDb.OleDbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehav ior behavior)
в Int32 System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
в Int32 System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior)
в Int32 System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)
как static void autoPrice.autoPriceEngine.searchPart(Object searchIndex) в d:\other\autoPrice\autoPrice\Classes.cs:строка 616
в static void System.Threading.ThreadHelper.ThreadStart_Context(Object state)
в static void System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
в void System.Threading.ThreadHelper.ThreadStart(Object obj)
0
512 / 298 / 37
Регистрация: 22.06.2011
Сообщений: 929
04.08.2011, 17:13 26
Cannot update. Database or object is read-only
Файл чем-то занят может? или только для чтения?
И еще: Либо HDR=NO, либо вместо [F2] имя столбца
0
0 / 0 / 0
Регистрация: 21.06.2011
Сообщений: 21
04.08.2011, 17:28  [ТС] 27
Цитата Сообщение от Ice_and_Fire Посмотреть сообщение
Cannot update. Database or object is read-only
Файл чем-то занят может? или только для чтения?
нет, перепроверил атрибуты и все кто мог обращаться - все ок...

Цитата Сообщение от Ice_and_Fire Посмотреть сообщение
И еще: Либо HDR=NO, либо вместо [F2] имя столбца
ок, поправил на "HDR=NO"
0
512 / 298 / 37
Регистрация: 22.06.2011
Сообщений: 929
04.08.2011, 18:32 28
если проблема осталась - выложите сюда файл (или часть) - я попробую написать код (завтра, сейчас по девкам)
0
0 / 0 / 0
Регистрация: 21.06.2011
Сообщений: 21
04.08.2011, 19:00  [ТС] 29


Добавлено через 12 минут
мой код совершает поиск по этому файлу за примерно 12сек... что интересно, то первый поиск после запуска програмы длится долго - порядка 20-30сек, а каждый следующий быстрее... вплоть до 7-8сек..
О_о
0
512 / 298 / 37
Регистрация: 22.06.2011
Сообщений: 929
05.08.2011, 09:04 30
Не работает с таким именем файла. test.csv и test.txt работают
0
Заблокирован
05.08.2011, 14:46 31
Цитата Сообщение от RaMoNVicious Посмотреть сообщение
что интересно, то первый поиск после запуска програмы длится долго - порядка 20-30сек, а каждый следующий быстрее... вплоть до 7-8сек..
Если я не ошибаюсь, это особенности Винды.
0
0 / 0 / 0
Регистрация: 21.06.2011
Сообщений: 21
05.08.2011, 19:06  [ТС] 32
Цитата Сообщение от Ice_and_Fire Посмотреть сообщение
Не работает с таким именем файла. test.csv и test.txt работают
и как по перформансу?

у меня кстати не получилось ничего найти... гдето чтото косячу...
0
826 / 717 / 110
Регистрация: 06.10.2010
Сообщений: 825
Записей в блоге: 1
05.08.2011, 21:32 33
Следующий код ищет за 3.8сек.
C#
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
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
 
namespace ConsoleApplicationTest {
    public static class Program {
        private static void Main() {
            string path = @"D:\testFull.txt";
            string searchString = @"415011910";
 
            string ans;
            do {
                Console.WriteLine( "Start" );
                DateTime time = DateTime.Now;
 
                List<string> result = (from line in File.ReadLines( path )
                                           .AsParallel()
                                           .WithDegreeOfParallelism( 2 )
                                       where line.Split( '\t' )[ 1 ].Equals( searchString, StringComparison.Ordinal )
                                       select line).ToList();
 
                TimeSpan past = DateTime.Now - time;
                Console.WriteLine( past );
 
                foreach ( string r in result ) {
                    Console.WriteLine( r );
                }
 
                Console.WriteLine( "Again? (Y)" );
                ans = Console.ReadLine().ToUpper();
            }
            while ( ans == "Y" );
        }
    }
}
Лучше использовать ReadLines, а не ReadAllLines. Этот метод загружает в память только одну строку, а не сразу весь файл.
Сделано для .NET 4, в более ранних версиях .AsParallel().WithDegreeOfParallelism( 2 ) можно убрать.
1
05.08.2011, 21:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.08.2011, 21:32
Помогаю со студенческими работами здесь

Осуществлять поиск в файле необходимых дат
Здравствуйте. Подскажите пожалуйста в создании следующей программы: &quot;Необходимо написать...

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

Как в среде VISUAL C++ 2008 осуществлять поиск текста в файле WORD ?
Здравствуйте ! Подскажите, пожалуйста, как в среде VISUAL C++ 2008 осуществлять поиск текста в...

Нужно исправить поиск по имени в файле
Проблема вот в чем допустим пользователь ввел Dnepr для поиска.В файле записано так: Dnepr.......


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru