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

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

17.02.2016, 10:35. Показов 5306. Ответов 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
33450 / 21550 / 8248
Регистрация: 22.10.2011
Сообщений: 37,002
Записей в блоге: 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
33450 / 21550 / 8248
Регистрация: 22.10.2011
Сообщений: 37,002
Записей в блоге: 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
33450 / 21550 / 8248
Регистрация: 22.10.2011
Сообщений: 37,002
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Контроль уникальности строк в табличной части документа
Maks 18.06.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ПланированиеСпецтехники" с табличной частью "НаличиеОборудования", разработанного в КА2. Задача: контроль уникальности строк в. . .
Клиент
Uhbif79 18.06.2026
Здесь простой клиент для работы с сервером.
Сервер
Uhbif79 18.06.2026
Выкладываю простейший сервер.
Дефенестрация
kumehtar 18.06.2026
Узнал интересное слово. Дефенестрация. Это когда ты выбрасываешь кого-либо или что-либо из окна. Возьму на вооружение)))
Дихотомия добра и зла
kumehtar 18.06.2026
Как Дзен-буддисты говорят о добре и зле: не нужно воевать против зла, нужно воевать против невежества. Тогда добро станет ествественным, и поэтому вечным. Но дело в том, что невежество всё время. . .
Своя Интернет-Компания
iceja 18.06.2026
Я программист с экономическим образованием, пишу свой проект, это SaaS для бизнесов. Мне нужен co-founder с высшим экономическим образованием, и/ или инвестор. Сейчас проект в интенсивной разработке,. . .
24 Мат модель здравосохранения: функциональные требования к строительству пищеблока
anaschu 18.06.2026
СРесурсами1: финансовый SD-контур, калькулятор функциональных требований пищеблока Сегодня разделили затраты в агенте Экономика по образцу модели НАСОСЫ, добавили расчёт ROI и построили первый. . .
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru