5 / 0 / 0
Регистрация: 02.01.2013
Сообщений: 42

Парсинг большого текстового файла

17.02.2016, 10:35. Показов 5289. Ответов 36
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую! Вопрос вот в чем - Как открыть файл и прочесть содержимое разделив его на итемы. Пример кода на питоне.
Python
1
2
3
4
5
6
file = open('X:\\model\\'+date+'.cut\\MainCategories\\омом.txt')
        for line in file:
            hours = []
            item = line.split('|')
            cam = item[1].split(',')
            time = item[2].split(',')
И как после завершения цикла все удалить, чтоб начать парсинг следующего файла и продолжить цикл.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.02.2016, 10:35
Ответы с готовыми решениями:

Парсинг строк из текстового файла
Доброго времени суток, господа! Уже n-ое количество времени мучаюсь со следующей задачей: Имеется программа, в которой по нажатию...

qt - парсинг большого файла
теперь у меня такая проблема. Имеется txt файл в unicode, в нем 120 000 строк текста вида слово=транскрипция, как бы мне находить...

Парсинг текстового файла в map
Здравствуйте! Подскажите, пожалуйста, как парсить текстовый файл в map. Например, есть файл, в котором записано следующее: 1 a 2 b 3...

36
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33441 / 21543 / 8245
Регистрация: 22.10.2011
Сообщений: 36,976
Записей в блоге: 12
17.02.2016, 16:34
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Avazart Посмотреть сообщение
странно что работаете ибо wchar_t/char не совместимо
Где именно? В open? Так он умеет открывать файлы с именами, заданными как через const char *, так и через const wchar_t *. Да и у SplitString никакой проблемы с AnsiString-ами не было никогда.

Добавлено через 4 минуты
Цитата Сообщение от Moriska32 Посмотреть сообщение
я так полагаю места не хватило опять где то
Нет. Это вылет за пределы массива TStringDynArray. Как пример - если при парсинге строки "test|10,20,30|3,4,5" попытаться обратиться к time[3] или cam[3] - то будет подобная ошибка. Потому что индексы как массива time, так и массива cam тут от 0 до 2.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
17.02.2016, 17:58
Цитата Сообщение от volvo Посмотреть сообщение
так и через const wchar_t *.
Не умеет, по крайней мере не должен уметь http://ru.cppreference.com/w/c... tream/open
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33441 / 21543 / 8245
Регистрация: 22.10.2011
Сообщений: 36,976
Записей в блоге: 12
17.02.2016, 18:12
Цитата Сообщение от Avazart Посмотреть сообщение
по крайней мере не должен уметь
Билдер с тобой не согласен:



Можешь предъявить претензии разработчикам, или писать с использованием тех компиляторов, которые делают "как надо". Я, если кто забыл, программы без тестирования не выкладываю. Если выложено - значит, Билдер умеет, и код отработал.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
17.02.2016, 18:47
Цитата Сообщение от volvo Посмотреть сообщение
или писать с использованием тех компиляторов, которые делают "как надо"
Цитата Сообщение от volvo Посмотреть сообщение
если кто забыл, программы без тестирования не выкладываю.
А вот интересно, умеет ли это новый компилятор на clang
Цитата Сообщение от volvo Посмотреть сообщение
Билдер умеет, и код отработал.
И отработает ли код с ним.
0
17.02.2016, 18:58
 Комментарий модератора 

Avazart, нет, не интересно. В рамках данной темы интересен "парсинг большого текстового файла".
0
5 / 0 / 0
Регистрация: 02.01.2013
Сообщений: 42
18.02.2016, 10:15  [ТС]
Ммм.. но я не выводил в текст, я для начала решил просто собрать массив. Но при расчете 1 файла выдает такую ошибку.

Добавлено через 15 минут
С маленькими файлами работает отлично, все что мне нужно выносит и как я хочу заносит куда нужно. Но вот большими файлами отказывается нормально работать.

Добавлено через 30 секунд
Просто у меня файли текстовые размерами 600 и более МБ
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33441 / 21543 / 8245
Регистрация: 22.10.2011
Сообщений: 36,976
Записей в блоге: 12
18.02.2016, 10:25
Цитата Сообщение от Moriska32 Посмотреть сообщение
я для начала решил просто собрать массив
Ну вот поэтому и ошибка. Какой смысл читать файл построчно, экономя память, и тут же бездарно разбазарить эту память для хранения результатов парсинга? Пиши результаты сразу в файл, ничего не будет вылетать.
0
5 / 0 / 0
Регистрация: 02.01.2013
Сообщений: 42
18.02.2016, 12:43  [ТС]
Так даже при занесении это в файл разве оно не останется в памяти? да и те значения которые я выношу из файла мне еще подсчитать надо. Я могу скинуть полный код работающий на питоне. Но я хочу его переписать в си в целях ускорения обработки.

Добавлено через 1 час 4 минуты
При занесении значений в файл мне позже снова придется делать еще парсинг чтобы сравнить значения с таблицей после чего все эти данные вынести в ексель. И если учесть что файлов может быть более 30 такого обьема то мне кажется что этот вариант не подходит.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.02.2016, 12:50
Цитата Сообщение от Moriska32 Посмотреть сообщение
Но я хочу его переписать в си
Это не раздел си, это раздел плюсов.

Цитата Сообщение от Moriska32 Посмотреть сообщение
Я могу скинуть полный код работающий на питоне.
Может с этого стоило начинать?
0
5 / 0 / 0
Регистрация: 02.01.2013
Сообщений: 42
18.02.2016, 12:58  [ТС]
Python
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
baza.execute("...")
m = baza.fetchall()
baza.execute("....")
ms = baza.fetchall()
connect.close()
startdate = datetime.datetime(2015,11,1)
datelist = [datetime.datetime.strftime(startdate+datetime.timedelta(days=i),'%Y-%m-%d') for i in range(30)]
resultGT = {}
for date in datelist:
    print(date)
    M = set()
    MS = set()
    ALL = set()
    resultGT[date] = {'MS':0,'M':0,'ALL':0}
    try:
        file = open('X:\\model\\'+date+'.cut\\MainCategories\\омномv3.txt')
        for line in file:
            hours = []
            item = line.split('|')
            cam = item[1].split(',')
            time = item[2].split(',')
            CountMs = 0
            CountM = 0
            for camera in cam:
                if c in mcams: CountM += 1
                if c in inMscams: CountMs += 1
            if CountMs == 0 and CountM != 0: resultGT[date]['MK'] += 1
            if CountMs != 0 and CountM == 0: resultGT[date]['MS'] += 1
            if CountMs != 0 and CountM != 0: resultGT[date]['ALL'] += 1
        file.close()
    except FileNotFoundError: print('HET')
Некоторые строки выкинул, дабы сохранить конфиденциальность. там просто сетевые запросы есть)
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.02.2016, 16:29
Ну а теперь код на плюсах покажите, который у вас ошибки выдает.

Добавлено через 9 минут
И пример файла.
0
5 / 0 / 0
Регистрация: 02.01.2013
Сообщений: 42
18.02.2016, 16:35  [ТС]
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
for (int i = 0; i <= sub; i++) {
        AnsiString typ[0], s, pb;
        Application->ProcessMessages();
        ProgressBar1->Value += 1;
        DateStart +=1.0;
               Memo1 ->Lines ->Add(FormatDateTime ("yyyy-mm-dd", DateStart));
               data = FormatDateTime ("yyyy-mm-dd", DateStart);
               //Memo1 ->Lines ->Add(data);
 
 
            if ((CheckBox6->IsChecked== false)&&(CheckBox7->IsChecked == false)) {
 
 
 
                Memo1 -> Lines ->Add(L"Выберите ... или ...");
                    break;
                    }
                    else {
                      // Проверка на выбор типа 
                    if ((CheckBox6->IsChecked == true)&&(CheckBox7->IsChecked == true)) {
                    AnsiString typ[2] = {"GT","IT"};
                    //ifstream fileit, filegt;
                    std::auto_ptr<TStringList>fileit(new TStringList);
                    std::auto_ptr<TStringList>filegt(new TStringList);
                    fileit->Clear();
                    filegt->Clear();
                    String sgt="\\\\DMITRY-HP\\SharedFolder\\model"+data+".cut\\MainCategories"+typ[0]+"v3.txt";
                    String sit="\\\\DMITRY-HP\\SharedFolder\\model"+data+".cut\\MainCategories"+typ[1]+"v3.txt";
                     Memo1->Lines->Add(sgt);
                     Memo1->Lines->Add(sit);
 
                     //fileit->LoadFromFile(sit);
                     //filegt->LoadFromFile(sgt);
                     //String filename = "d:\\test\\01.txt";
 
    ifstream ifile; //Объявление списка ifile
    
    ifile.open(sgt.c_str()); //Открыть файл
    if (ifile.good()) //Проверка на присутствие файла
    {
        while (!ifile.eof()) //цикл до последней строчки
        {
            std::string line;  // Объявление строки line
            getline(ifile, line); //Построчное чтение
 
            TStringDynArray items = SplitString(line.c_str(), "|"); //разделение строки на итемы
            TStringDynArray cam = SplitString(items[1], ",");       //разделение итема на массивы
            TStringDynArray time = SplitString(items[2], ",");
 
                        
            Memo1->Lines->Add(items[1]);
            
        }
    }
    ifile.close(); //закрыть файл
Добавлено через 5 минут
что то слеши пропали и не добавляются, но не суть
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
18.02.2016, 16:45
Цитата Сообщение от Moriska32 Посмотреть сообщение
что то слеши пропали
в этом вэб-редакторе слэши передаются "двойными"
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.02.2016, 16:49
Moriska32,
Проблема в том что у вас нет проверок ни в коде на питоне не на С++.
Нужно проверять а есть ли такой элемент items[1] т.е с индексом 1 или нет, может там в файле нет двух элементов.
0
5 / 0 / 0
Регистрация: 02.01.2013
Сообщений: 42
18.02.2016, 16:50  [ТС]
Не могу сказать почему, но их не может не быт, они есть, на питоне все прекрасно работает, без ошибок с памятью.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.02.2016, 17:06
Лучший ответ Сообщение было отмечено Moriska32 как решение

Решение

Цитата Сообщение от Moriska32 Посмотреть сообщение
Не могу сказать почему, но их не может не быт, они есть, на питоне все прекрасно работает, без ошибок с памятью.
Это не значит что не нужно обрабатывать ошибки.

C++
1
2
3
4
#include <vector>
#include <string>
#include <boost/algorithm/string/split.hpp>
#include <boost/algorithm/string.hpp>

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
std::ifstream ifs("filename.txt");
 
std::string line;
while(getline(ifs, line))
{
  std::vector<std::string> items;
  boost::split(items,line,boost::is_any_of("|"));
 
  if(items.size()>=3) // Количество элементов больше  или равное 3 (индексы 0,1,2)
  {
    std::vector<std::string> cams;
    boost::split(cams,items[1],boost::is_any_of(","));
 
    std::vector<std::string> times;
    boost::split(times,items[2],boost::is_any_of(","));
 
    Memo1->Lines->Add(items[1].c_str());
  }
  else Memo1->Lines->Add("Меньше трех итемов");
}
1
5 / 0 / 0
Регистрация: 02.01.2013
Сообщений: 42
18.02.2016, 17:10  [ТС]
Воо векторы я сейчас о них читал, но чот туговато шло, спасибо сейчас опробую.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.02.2016, 17:10
Помогаю со студенческими работами здесь

Функция fopen() для большого текстового файла читает только первую строку
Есть текстовой файл 4.5 мб, нужно его открыть для чтения из него строк. FILE *f = fopen(&quot;C:\\members.txt&quot;,...

Считывание и парсинг данных с текстового файла
Как правильно считать такую строку с етого файла? 3 circle 3.0 3.0 5.0 square 0.0 0.0 0.0 4.0 4.0 4.0 4.0 0.0 triangle 3.0 3.0 0.0...

Добавить в конец первого текстового файла содержимое второго текстового файла
Даны два текстовых файла. Добавить в конец первого файла содержимое второго файла.

Парсинг большого количества hex значений из текстового файла
Нужно из текстового файла прочитать кучу hex целочисленных значений от int16 до uint64, а книжку читать не хочется, но если придётся, то...

Парсинг большого XML файла
Доброго времени! Имеется очень большой XML из которого нужно вытащить данные. Проблема в том что стандартный парсер TXMLDocument пытается...


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

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Опции темы

Новые блоги и статьи
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации: В классе Работник добавить: накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни коэффициентПрезентеизма — снижает продуктивность. . .
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день. Для работы необходим браузер,. . .
Модель здравосохранения 16. Слишком хорошие и здоровые сотрудники уходят, недовольные зарплатой
anaschu 23.05.2026
Отладка увольнений и настройка производительности Сегодня во второй половине дня разобрались с механикой увольнений и настроили коэффициент сложности заданий. Вот что было сделано. . . .
Как я стал коммунистом))) Модель сохранения здоровья сотрудников, запись блога номер 15
anaschu 23.05.2026
Внезапно хорошее здоровье сотрудников не нужно капиталистам?))
Модель здравоСохранения 15. Как мы чинили AnyLogic модель рабочего коллектива: сочленение диаграммы состояний болезней и поломок в ресурспул
anaschu 23.05.2026
Как мы чинили AnyLogic модель рабочего коллектива Сегодня разобрались с пятью багами, из-за которых модель либо падала с ошибкой, либо давала совершенно бессмысленные результаты. Каждый баг был. . .
Диалоги с ИИ
zorxor 23.05.2026
Насколько я понимаю - Вы - Искусственный Интеллект. Это так? Да, всё верно. Я — искусственный интеллект. Я представляю собой большую языковую модель, созданную для помощи в самых разных задачах. . . .
Модель здравосохранения 14. Собираем всю модель вместе.
anaschu 22.05.2026
Модель собрана. В будущих постах на видео я покажу, как она работает. В этом посте запускаем её, проверяем результаты и разбираем что можно с ней делать дальше. Перед запуском проверяем. . .
Модель здравоохранения 13. Добавление самой системы здравоохранения.
anaschu 22.05.2026
В предыдущем посте мы настроили болезни. Теперь добавим события, которые управляют здоровьем всего коллектива, а также настроим рабочий график и расчёт финансов. В Main создаём четыре события. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru