Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
5 / 0 / 0
Регистрация: 02.01.2013
Сообщений: 42

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

17.02.2016, 10:35. Показов 5245. Ответов 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
33412 / 21522 / 8236
Регистрация: 22.10.2011
Сообщений: 36,922
Записей в блоге: 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
33412 / 21522 / 8236
Регистрация: 22.10.2011
Сообщений: 36,922
Записей в блоге: 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
33412 / 21522 / 8236
Регистрация: 22.10.2011
Сообщений: 36,922
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru