powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Остановить велосипед или кое-что полезное
25 сообщений из 31, страница 1 из 2
Остановить велосипед или кое-что полезное
    #34037557
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Думаю, что у всех есть небольшие классы для каких-то целей.
Вот класс, который разбирает на поля строку, разделённую какими-то разделителями. Если указать chrSep, то у поля будут отрезаться концевые ограничители, а сдвоенные - собираться в один.
'aaa''a' -> aaa'a
Код: plaintext
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.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
//Parse.H
#pragma once

#include <string>
#include <vector>
using namespace std;


class Parse{
public:
	Parse(char *fd, char cs = '\0'): fldSep(fd),chrSep(cs),	nFields( 0 ){};
	~Parse();
	virtual int ParseLine(char *line);

	virtual void SetDelim(char *fd, char cs='\0'){fldSep = fd; chrSep = cs; }
	virtual const int GetNoOfFields()const {return nFields;}
	virtual const char *GetField(int i) const { return vStr[i]; }

protected:
	void ParseLine1(char *line);
	void ParseLine2(char *line);
	char *GetChrField(char* &curr, char* &end);

protected:
	string fldSep;
	char   chrSep;
	int nFields;
	vector<char *> vStr;

};
//Parse.CPP
#include "StdAfx.h"
#include ".\parse.h"

Parse::	~Parse()
{
	vStr.clear();
}
int Parse::ParseLine(char *line)
{
	vStr.clear();
	if ( fldSep == "")
		return - 1 ;
	if ( chrSep == '\0' )
		ParseLine1(line);
	else
		ParseLine2(line);
	nFields = vStr.size();
	return nFields;
}

void Parse::ParseLine1(char *line)
{
	char *cp = line,*curr =line;
	char *end = line+strlen(line);
	if ( fldSep.length() ==  1 )
		while( (cp	= strchr(curr, fldSep[ 0 ])) != NULL){
			vStr.push_back(curr);
			*cp = '\0';
			curr = cp+ 1 <end ? cp+ 1  : cp;
		} 
	else 
		while( (cp	= strstr(curr, fldSep.c_str())) != NULL){
			vStr.push_back(curr);
			*cp = '\0';
			curr = cp+ 1 <end ? cp+ 1  : cp;
		} 
	if ( *curr)
		vStr.push_back(curr);
	if ( end[- 1 ] == '\n' )
		end[- 1 ] = '\0';
}

char* Parse::GetChrField(char* &curr, char* &end)
{
	char *cp =curr;
	if ( *cp == chrSep){
		memmove(cp,cp+ 1 ,strlen(cp));
		end--;
		for( ; *cp ; ++cp){
			if ( *cp == chrSep ){
				memmove(cp,cp+ 1 ,strlen(cp));
				end--;
				if ( ! strncmp(cp,fldSep.c_str(),fldSep.length()) )
					return cp;
			}
		}
		return NULL;
	}
	else 
		cp = strstr(curr, fldSep.c_str());
	return cp;
}

void Parse::ParseLine2(char *line)
{
	char *cp = line,*curr =line;
	char *end = line+strlen(line);
	
	while( (cp = GetChrField(curr,end) ) != NULL ){
		vStr.push_back(curr);
		*cp = '\0';
		curr = cp+ 1 <end ? cp+ 1  : cp;
	}
	if ( *curr)
		vStr.push_back(curr);
	if ( end[- 1 ] == '\n' )
		end[- 1 ] = '\0';
}
Замечания по оптимизации приветствуются, но должны быть оттестированы.
...
Рейтинг: 0 / 0
Остановить велосипед или кое-что полезное
    #34037576
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Этот класс парсит файл построчно. Обработка ошибок минимальна. Вероятность того, что malloc не выделит память под Windows я полагаю равной нулю исходя из опыта.
Код: plaintext
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.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
//ParseFile.h
#pragma once
#include ".\parse.h"

class ParseFile:public Parse{
	public:
	ParseFile():
		Parse(""),nBsize( 1000 ),buf(NULL),fileName(NULL),fp(NULL)
		{};
	ParseFile(char *fnm, size_t bsz, char *fd, char cs = '\0'):
		Parse(fd,cs),nBsize(bsz),buf(NULL),fileName(fnm),fp(NULL)
		{};
	~ParseFile();
	int Open(const char *fnm);
	int GetLineCount();
	bool IsOpen()
		{	
			return fp != NULL;
		}
	int ParseLine();
	void SetBuff(size_t bsz);

protected:
	size_t nBsize;
	char *buf;
	char *fileName;
	FILE *fp;

};
//ParseFile.cpp
#include "StdAfx.h"
#include ".\parsefile.h"

ParseFile::~ParseFile()
{
	if (fp)
		fclose(fp);
	if (buf)
		free(buf);
}

int ParseFile::Open(const char *fnm)
{
	if ( fp ) 
		fclose(fp);
	if ( (fp = fopen(fnm,"r")) == NULL)
		return  0 ;
	if ( !buf && (buf = (char*)malloc(nBsize)) == NULL)
		return  0 ;
	return  1 ;
}

int ParseFile::ParseLine()
{
	ASSERT( fp);
	if ( fgets(buf,nBsize- 1 ,fp) == NULL )
		return  0 ;
	else
		return Parse::ParseLine(buf);
}

int ParseFile::GetLineCount()
{
	int n =  0 ;
	ASSERT(fp );
	for(;fgets(buf,nBsize- 1 ,fp) != NULL; ++n);
	fseek(fp,0l,SEEK_SET);
	return n;
}

void ParseFile::SetBuff(size_t bsz)
{
	nBsize = bsz; 
	if (buf) 
		free(buf); 
	buf = (char*)malloc(nBsize); 
}
...
Рейтинг: 0 / 0
Остановить велосипед или кое-что полезное
    #34037583
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
niknameДумаю, что у всех есть небольшие классы для каких-то целей.
Вот класс, который разбирает на поля строку, разделённую какими-то разделителями. Если указать chrSep, то у поля будут отрезаться концевые ограничители, а сдвоенные - собираться в один.
'aaa''a' -> aaa'a...Замечания по оптимизации приветствуются, но должны быть оттестированы.

замечание одно - глянуть STL...

(круглый)
...
Рейтинг: 0 / 0
Остановить велосипед или кое-что полезное
    #34037597
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Угу. Беда в том, что
aa^^b^'ccc''c'^\n
штатными средствами не распарсить в
1."aa"
2.""
3."b"
4."ccc'c"
5.""
...
Рейтинг: 0 / 0
Остановить велосипед или кое-что полезное
    #34037604
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nikname...Обработка ошибок минимальна. Вероятность того, что malloc не выделит память под Windows я полагаю равной нулю исходя из опыта.....

советы дня..
1) не экономте на обработке ошибок - сьэкономите кучу времени...особенно в проектах поболее хэллохты мир...
2) отсутсвие проверки после молока - типичная и самая распространённая ошибка начинающих и не очень программистов. не хватка памяти - и такое так же встречается....


успехов Вам
(круглый)
...
Рейтинг: 0 / 0
Остановить велосипед или кое-что полезное
    #34037629
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. Спасибо. Правда я не экономлю на этом.
2. Я засовывал в вектор (структурами) и сортировал 1.5 гиговый файл на машине с 256М. После этого решил, что результат malloc проверять не буду.
...
Рейтинг: 0 / 0
Остановить велосипед или кое-что полезное
    #34037661
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nikname1. Спасибо. Правда я не экономлю на этом.
2. Я засовывал в вектор (структурами) и сортировал 1.5 гиговый файл на машине с 256М. После этого решил, что результат malloc проверять не буду.

1) перечислите пожалуйста операционки, на котором производился тест ?
2) задача сортировки, кстати если отпимальные размеры, нагрузка на память - не велика... хватит и пару киллобайт, ну может чуток поболее...


(круглый)
...
Рейтинг: 0 / 0
Остановить велосипед или кое-что полезное
    #34037691
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. Это был не тест и операционка - Windows XP. У меня нет необходимости писать под другую операционку. Но, при желании, этот класс можно сделать вполне безопасным. После malloc выдавать throw в случае отказа, то же при открытии и чтении.

Я придерживаюсь мнения о том, что всегда возможен разумный компромисс. Хотя, вероятно, вы и правы.
2. Согласен, правда забыл добавить, что в памяти было поболе, чем 1.5 Гига, поскольку я одновременно проверял ряд полей и их наборов на уникальность - засовывая в map и подсчитывая количество одинаковых. БД работала слишком медленно, пришлось имитировать.
...
Рейтинг: 0 / 0
Остановить велосипед или кое-что полезное
    #34037742
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0не хватка памяти - и такое так же встречается....на винде при этом начинается ТАКОЕ, что о работоспособности каких-то там программок забываешь начисто :) хотя да... если писать что для кофеварок, то да...
...
Рейтинг: 0 / 0
Остановить велосипед или кое-что полезное
    #34037753
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nikname1. Это был не тест и операционка - Windows XP. У меня нет необходимости писать под другую операционку. Но, при желании, этот класс можно сделать вполне безопасным. После malloc выдавать throw в случае отказа, то же при открытии и чтении.

Я придерживаюсь мнения о том, что всегда возможен разумный компромисс. Хотя, вероятно, вы и правы.
2. Согласен, правда забыл добавить, что в памяти было поболе, чем 1.5 Гига, поскольку я одновременно проверял ряд полей и их наборов на уникальность - засовывая в map и подсчитывая количество одинаковых. БД работала слишком медленно, пришлось имитировать.

понимаете ли в чём дело...
1) требование, предьявляемые обычно заказчиком, чтоб дышало на всех Win32 чаще встречается чем обратное... А это и Win95, Win98, NT и т.д.. (первые из перечисленных вообще мягко говоря сильно глючные, там шашками поаккуратней треба)... То, что у буржуинов встречается ышо MSDOS 3.20 - надеюсь сильно Вас не удивит.. Они то простые ребята - работает, значит не трож... наверное в этом есть своё рац. зерно...
2) вот по поводу БД - тут Вы зря так сказали...Щаз народ сбежится.. БД по поределению - работать медленне не должна. Почему - тут несколько фундаментальных камней... Первый - то, что у одиночки меньше шансов родить что нить более существенное, чем коллектив разработчиков-математиков...Второе, то что можно ускорить за счёт похеривания определённого функционала.. Ну скажем там транзакционность...Или распределённость.. Но тут другая сторона медали - очень мало задач которые не потребуют этого на таких массивах данных, с которыми не справилась БД и справился самопал...Или по другому - надо понимать, за счёт чего Вы можете обскакать стандартную БД, при этом глупо рассчитывать что Вы(я, он, не важно) умнее, людей не первый год копающихся в этом (и зарабатывающих кстати)...

И ещё по поводу больших объёмов данных - рекомендую книгу Рихтера "Windows для проффесионалов". Там как раз есть оптимальный пример, для таких вот дел... Правда с сортировкой - тут уж теорию хранения данных нуна читать, там всё написано...у больших и великих :)


с уважением
(круглый)
ЗЫ
По поводу примера - если найду, повешу на форум...
...
Рейтинг: 0 / 0
Остановить велосипед или кое-что полезное
    #34037804
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну бд - универсальный инструмент, что накладывает на него определённые ограничения - универсальный инструмент запросто может проиграть специализиованному. Например, означенная выборка записей по группе уникальных полей (какие серваки такое подерживают?) или там выборка случайных записей (ну после некоторого секса и такое можно замутить :) )
...
Рейтинг: 0 / 0
Остановить велосипед или кое-что полезное
    #34037828
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. Наши заказчики требуют XP и 2000.

2. Дано. Чуть больше 100 000 файлов, общим весом в 1.5 гига.
Можно считать, что строка это ненормализованная таблица, которая превращается в 4-е таблицы.
Требуется понять - где и какие ключи, проверить их и разработать фильтры для отбраковки сбойных записей.
Загрузка в БД.
Построение индексов.
Формирование справочников.

На С++ с STL это заняло часа три на разработку и выгрузку справочников. Ещё несколько итераций длинной в день на отработку фильтров - они нетривиальные.

Загрузка в подручную БД, это была ASA была прервана где-то часа через три же.

Ну и мне никогда в голову не пришло бы писать свою БД, разве что за большие деньги и без всяких гарантий.
...
Рейтинг: 0 / 0
Остановить велосипед или кое-что полезное
    #34037882
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
niknameУгу. Беда в том, что
aa^^b^'ccc''c'^\n
штатными средствами не распарсить в
1."aa"
2.""
3."b"
4."ccc'c"
5.""

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
	char strOut[] = "aa^^b^'ccc''c'^\n";
	char* pFirst;
	char* pNext;
	int c = '^';
	pFirst = strOut;
	while((pNext = strchr(pFirst, c)) != NULL)
	{
		_strnset_s(pNext, strlen(pNext) +  1 , '\0',  1 );
		printf("%s\r\n", pFirst);
		pFirst = ++pNext;
	}
	printf("%s\r\n", pFirst);


кстати в STL вроде были функции кушающие скопом куча разделителей...

(круглый)
...
Рейтинг: 0 / 0
Остановить велосипед или кое-что полезное
    #34037916
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Угу.
Теперь напишем такую строку.
aaaaaa^'bbbb^aaa'^\n
1."aaaaaa"
2."bbbb^aaa"
3.""
...
Рейтинг: 0 / 0
Остановить велосипед или кое-что полезное
    #34037927
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
niknameУгу.
Теперь напишем такую строку.
aaaaaa^'bbbb^aaa'^\n
1."aaaaaa"
2."bbbb^aaa"
3.""

Вы сформулируйтесь сначала...
Что у Вас является разделителем...
Всё что не буковки - это одно...конкретный символ - это другое...
конкретная группа символов - это уже третье...


ик
(круглый)
...
Рейтинг: 0 / 0
Остановить велосипед или кое-что полезное
    #34037964
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Выгрузите, например что-нить из Exel в CSV. В одно из тектовых полей добавьте тот же разделитель, что и будет использоваться при выгрузке, символ " и ' и посмотрите, что получится.

Вообще, если вы хотите улучшить мой код, то просто напишите и оттестируйте, а потом сравните эффективность. А учить меня на ровном месте не стоит. Т.е. я всегда благодарен за совет, но только если он мне нужен.

Задача разбора текстовых файлов, похожих на CSV встаёт часто. Проблема, скажем strtok в том, что два последовательных разделителя она воспримет как один. Искать (в моём примере) ^' тож глупо, поскольку не все символьные поля обрамляются символом ' - обычно только если внутри встречается разделитель.

Такая же, примерно, структура файлов - выгрузок из БД.
...
Рейтинг: 0 / 0
Остановить велосипед или кое-что полезное
    #34037991
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nikname
Я придерживаюсь мнения о том, что всегда возможен разумный компромисс.

В подобных классах-утилитах, я стараюсь проверить все возможные варианты. Т.к. сейчас компьютеры быстрые, то пара иф-ов не помешает. Снижение быстродействия более, чем на 0,01 процента маловероятно. Даже, если программа заточена на непрерывное использование этого класса, вряд ли я буду от туда выкидывать подобные проверки.
...
Рейтинг: 0 / 0
Остановить велосипед или кое-что полезное
    #34038019
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
niknameВыгрузите, например что-нить из Exel в CSV. В одно из тектовых полей добавьте тот же разделитель, что и будет использоваться при выгрузке, символ " и ' и посмотрите, что получится.

Вообще, если вы хотите улучшить мой код, то просто напишите и оттестируйте, а потом сравните эффективность. А учить меня на ровном месте не стоит. Т.е. я всегда благодарен за совет, но только если он мне нужен.

Задача разбора текстовых файлов, похожих на CSV встаёт часто. Проблема, скажем strtok в том, что два последовательных разделителя она воспримет как один. Искать (в моём примере) ^' тож глупо, поскольку не все символьные поля обрамляются символом ' - обычно только если внутри встречается разделитель.

Такая же, примерно, структура файлов - выгрузок из БД.

1) уважаемый...делать за Вас работу - никто не будет...
2) если Вам совет не нужен - ну тогда в чём проблемы то ???
3) strtok простите, но лично я про него ничего не говорил...
4) искать в Ваших примерах - а оно мне нуна ?
5) Из/В Excell всё грузиться отлично, строиться замечательные графики испытаний (к примеру) а так же куча других форматов... Это маленькая толика того, что лично мне приходилось делать...



удачи Вам
(круглый)
ЗЫ
Велосипедостроение - это увы и ах, не по моей части...Так что извиняйте...
...
Рейтинг: 0 / 0
Остановить велосипед или кое-что полезное
    #34038027
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. Я просто опубликовал вполне рабочий класс для часто встречающихся случаев и предложил другим делиться ими же.
...
Рейтинг: 0 / 0
Остановить велосипед или кое-что полезное
    #34038157
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0Вообще, если вы хотите улучшить мой код, то просто напишите и оттестируйте,

1) уважаемый... делать за Вас работу - никто не будет...
[/quot]

Думаю, надо лучше стараться понимать собеседника.

ПС: Сорри, что влез. ;)
...
Рейтинг: 0 / 0
Остановить велосипед или кое-что полезное
    #34038172
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а что regexp вообще не в тему?
например
pcre
...
Рейтинг: 0 / 0
Остановить велосипед или кое-что полезное
    #34038179
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh..Думаю, надо лучше стараться понимать собеседника....

не правильные выделения...
вот так лучше...

"...Вообще, если вы хотите улучшить мой код, то просто напишите и оттестируйте ,...."

типа принимаю Ваши идеи, чтоб скомпоновать из них нечто...а мы тут создадим коммиссию, жюри, пресс релиз...


бред одним словом...
как там у класика...

"Все было: лужа на крыльце, | Знакомый профиль мусорного бака | И у забора писала собака | С задумчивой улыбкой на лице "

(круглый)
...
Рейтинг: 0 / 0
Остановить велосипед или кое-что полезное
    #34038236
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет. Этот класс вполне себе работает в нескольких проектах.
Да и было бы как-то неумно кидать готовый класс для тех целей, о которых пишете вы. И потом он действительно быстрый - сложно говорить об оптимальности, но он к нему (оптимуму) близок по скорости.

А вот про оттестируйте я написал именно для того, чтобы избавиться от торопливых рекомендаций.

Вы извините, что я вас оборвал выше, но я тож не мог врубиться- от чего вы на ровном месте советы даёте слишком поспешные по вполне понятному поводу.
...
Рейтинг: 0 / 0
Остановить велосипед или кое-что полезное
    #34038316
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0 Akh..Думаю, надо лучше стараться понимать собеседника....

не правильные выделения...
вот так лучше...

"...Вообще, если вы хотите улучшить мой код, то просто напишите и оттестируйте ,...."

типа принимаю Ваши идеи, чтоб скомпоновать из них нечто...а мы тут создадим коммиссию, жюри, пресс релиз...


бред одним словом...
как там у класика...

"Все было: лужа на крыльце, | Знакомый профиль мусорного бака | И у забора писала собака | С задумчивой улыбкой на лице "

(круглый)

Если разобрать структуру предложения, то можно сделать следующий вывод: предложение улучшить и оттестировать код, было для того случая, когда вы сами изъявите желание его улучшить. Это не просьба, а объяснение, как автор будет относиться к возможному вашему желанию улучшить код. Т.е. он не против. Даже, это похоже на "кидание перчатки" в вашу сторону. Ваш ответ, по структуре, отличался агрессивностью, как будто вас просят его улучшить. Теперь можно сделать вывод, что ваша реакция, не соответствовала исходным данным.
...
Рейтинг: 0 / 0
Остановить велосипед или кое-что полезное
    #34038388
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh...Ваш ответ, по структуре, отличался агрессивностью,...

Вам виднее...пущай будет так...


ик
(круглый)
ЗЫ
Даже если спирт замерзнет, | Все равно его не брошу, | Буду грызть его зубами - | Потому что он хороший!
...
Рейтинг: 0 / 0
25 сообщений из 31, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Остановить велосипед или кое-что полезное
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]