Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4 5   вперед  Ctrl      все
 Заменить запись в файл с txt на xlsx  [new]
xamelione25
Member

Откуда:
Сообщений: 63
Помогите сделать так чтобы запись происходила не в txt, а в Excel

+
#include<iostream>
#include<conio.h>
#include<locale.h>
#include<math.h>
#include<time.h>
#include<cmath>
#include<fstream>
#include<string>
float tpostyp = 0;//random
float tobrk = 0;//random
float tobrevm = 0;//random
int k = 0;
int t0 = 0;
int emkost = 0;
float lambda = 0.1;
float Xi = 0;
bool KanalSvob = true;
float proizvoditelnost = 0;
float stoimost = 0;
float cena = 1;
float vsignala = 0.01;
float p = 0;

using namespace std;
float FuncPostuplenie_v_kanal_vrem(int regim)
{
	if (regim == 2)
	{
		return tpostyp = 10;
	}
	else
	{
		Xi = 2 + rand() % 6;
		tpostyp = 0.1 * pow(2.71, -0.1 * Xi);
		return tpostyp + 10.0;
	}
}
float FuncObrabotka_v_kanal_vrem(int regim)
{
	if (regim == 2)
	{
		return tobrk = 10;
	}
	else
	{

		Xi = 2 + rand() % 6;
		tobrk = 1 / 1.5 / sqrt(2 * 3.14) * pow(2.71, -(pow(Xi - 10, 2)) / 2 / pow(1.5, 2));
		return tobrk + 10.0;

	}
}
float FuncObrabotka_v_evm_vrem(int regim)
{
	if (regim == 2)
	{
		return tobrevm = 33;
	}
	else
	{
		Xi = 2 + rand() % 6;
		tobrevm = 1 / 3 / sqrt(2 * 3.14) * pow(2.71, -(pow(Xi - 33, 2)) / 2 / pow(3.0, 2));
		return tobrevm + 33.0;
	}
}
float FuncEmkost(int regim)
{
	if (regim == 2)
	{
		return emkost = 4;
	}
	else
	{
		return emkost = 2 + rand() % 6;
	}
}
/*int FuncCountElementinEVM(int *Mass,int N)
{
	int j=0;
	int min=0;
	min=Mass[0];
	for(j=1;j<N;j++)//проход по каждой эвм
	{
		if(Mass[j]<Mass[j-1])//ищем наименьший элемент в очереди эвм
		{
			min=Mass[j];
		}
	}
	return min;
}*/
int main()
{
	int N = 0;
	int reg = 0;
	int j = 0;
	int min = -1;
	int mindex = 0;
	string stroka = "";
	//int **Mass;
	setlocale(LC_ALL, "Russian");
	srand(time(NULL));
	ofstream f1;
	f1.open("log.txt", ios_base::trunc);
	if (f1)
	{
		cout << "Файл успешно открыт для записи в него статистики" << endl;
	}
	cout << "	Введите количество ЭВМ, участвующих в процессе = ";
	cin >> N;//столько будет массивов (очередей)
	f1 << "Всего ЭВМ " << N << endl;
	int* MassEVM = new int[N];
	for (int i = 0; i < N; i++)
	{
		MassEVM[i] = 0;//эвм без сигналов
	}
	int* EmkostEVM = new int[N];//массив емкостей эвм
	for (int i = 0; i < N; i++)
	{
		EmkostEVM[i] = 4;//инициализация
	}
	int* countSignalEVM = new int[N];//сколько сигналов обработала каждая эвм (для статистики)
	for (int i = 0; i < N; i++)
	{
		countSignalEVM[i] = 0;//инициализация
	}
	int countDestroySignal = 0;//сколько сигналов было уничтожено из - за смены емкости эвм
	int* SvobodnostEVM = new int[N];//состояние  емкостей эвм 0 -свободно, 1-работает
	for (int i = 0; i < N; i++)
	{
		SvobodnostEVM[i] = 0;//инициализация
	}
	int* TimerEVM = new int[N];//Таймер на каждой ЭВМ, отвечающий за обработку сигнала
	for (int i = 0; i < N; i++)
	{
		TimerEVM[i] = 0;//инициализация
	}

	int buffer = 10000;
	cout << "Введите режим работы генератора 1- случайно, 2 - постоянно" << endl;
	cin >> reg;
	//cout<<"что вернула функция "<<FuncObrabotka_v_kanal_vrem(reg);
	float time1 = 0;
	float time2 = 0;
	float time3 = 0;
	float tend1 = 0;
	float tend2 = 0;
	float* tend3 = new float[N];
	for (int i = 0; i < N; i++)
	{
		tend3[i] = 0;
	}
	bool flag = true;
	bool newsignal = false;
	bool flagkanal = true;
	int* flagevm = new int[N];
	for (int i = 0; i < N; i++)//0 - свободная, 1 - обрабатывает
	{
		flagevm[i] = 0;
	}
	//while сам процесс
	do
	{
		t0 = t0 + 1;

		if (KanalSvob == true)//проверка на свободность канала
		{
			if (flagkanal == true)
			{
				tend1 = t0 + (time1 = FuncPostuplenie_v_kanal_vrem(reg));
				flagkanal = false;
			}
			//if(t0<tend1)//поступение в канал
			//{
			KanalSvob = false;
			//f1<<"Прошло"<<t0<<" мск"<<"Канал"<<KanalSvob<< "Сигнал обрабатывается в канале и не поступал в ЭВМ"<<endl;
		//}
		}
		else
		{

			if (buffer != 0)//если в буфере есть место, заносим сигнал в него
			{

				buffer--;//буфер уменьшен на величину сигнала
			}
		}
		//начало обработки сигнала в канале
		if (KanalSvob == false)//значит в канале есть сигнал
		{
			if (flag == true)
			{
				tend2 = t0 + (time2 = FuncObrabotka_v_kanal_vrem(reg));
				flag = false;
			}

			if (t0 < tend2)
			{

				//идет обработка сигнала
			}
			else
			{

				k++;//увеличиваем счетчик количества обработанных сигналов на 1
				newsignal = true;
				f1 << "Прошло " << t0 << " мск " << " Канал " << KanalSvob << " Из канала вышел новый сигнал. Всего сигналов обработано в канале = " << k << endl;
				if (t0 >= tend1)
				{
					KanalSvob = true;
					flag = true;
					flagkanal = true;
					buffer++;//берем из буфера следующий необработанный сигнал и освобождаем место

				}
			}

		}
		//поступление в ЭВМ
		if ((k != 0) && (newsignal == true))
		{
			//min=FuncCountElementinEVM(MassEVM,N); //ищем ЭВМ с наименьшей занятостью
			min = MassEVM[0];
			mindex = 0;
			for (j = 1; j < N; j++)//проход по каждой эвм
			{
				if (MassEVM[j] < min)//ищем наименьший элемент в очереди эвм
				{
					min = MassEVM[j];///////!!!!!
					mindex = j;
				}

			}
			//cout<<"минимальный элемент равен"<<min;
			MassEVM[mindex] = MassEVM[mindex] + 1;//добавляем сигнал в очередь на обработку ЭВМ


			if (MassEVM[mindex] > 0)//если машина обрабатывает сигнал, то её емкость не меняем
			{
				SvobodnostEVM[mindex] = 1;
				time3 = FuncObrabotka_v_evm_vrem(reg);
				TimerEVM[mindex] = time3;//Заводим таймер для выбранной ЭВМ
			}
		}
		//сама обработка
		for (int j = 0; j < N; j++)
		{
			if ((flagevm[j] == 0) && (newsignal == true))
			{
				tend3[j] = t0 + TimerEVM[j];
				flagevm[j] = 1;
				newsignal = false;
			}
			if (t0 <= tend3[j])
			{
				//сигнал еще обрабатывается
				f1 << "Прошло " << t0 << " мск" << "Канал " << KanalSvob << " Сигнал обрабатывается в " << j + 1 << " ЭВМ" << endl;
				for (int index = 0; index < N; index++)
				{
					if (SvobodnostEVM[index] == 0)//если ЭВМ не работает, то изменяем её емкость
					{
						EmkostEVM[index] = FuncEmkost(reg);
						countDestroySignal = countDestroySignal + MassEVM[index];
						MassEVM[index] = 0;//очищаем очередь ЭВМ, т.к была изменена её ёмкость
					}
				}
			}
			else
			{
				for (int index3 = 0; index3 < N; index3++)//SvobodnostEVM[j]=0;
				{
					if ((t0 > tend3[index3]) && (tend3[index3] > 0) && (SvobodnostEVM[index3] == 1))//вм закончила обработку
					{
						if (flagevm[index3] == 1)
						{
							SvobodnostEVM[index3] = 0;
							countSignalEVM[index3] = countSignalEVM[index3] + 1;//увеличиваем счетчик количесва обработанных ЭВМ сигналов
							f1 << "Прошло " << t0 << " мск" << "Сигнал обработался в " << index3 + 1 << " ЭВМ" << endl;
							TimerEVM[index3] = 0;//обнуляем таймер ЭВМ, которая закончила свою работу
							flagevm[index3] = 0;
						}
					}

				}
			}
		}
		if (min == -1)
		{
			f1 << "Прошло " << t0 << " мск " << " Канал " << KanalSvob << " Сигнал обрабатывается в канале и не поступал в ЭВМ" << endl;
		}
		else
		{
			//f1<<"Прошло "<<t0<<" мск"<<"Канал"<<KanalSvob<< "Сигнал обрабатывается в"<<min<<" ЭВМ"<<endl;
		}
	} while ((k < 1000) && (buffer != 0));//k=1000
	cout << "Запись в файл завершена" << endl;
	int signalovobr = 0;
	f1 << "Прошло " << t0 << " мск " << " Канал " << KanalSvob << " Обработка завершена. Обработано сигналов каждой ЭВМ:" << endl;
	for (int index = 0; index < N; index++)
	{
		f1 << "ЭВМ № " << index + 1 << " " << countSignalEVM[index] << endl;
		signalovobr = signalovobr + countSignalEVM[index];
	}

	f1 << "В результате изменения емкости ЭВМ было уничтожено " << countDestroySignal << " сигналов" << endl;
	proizvoditelnost = float(k) / float(t0);
	stoimost = signalovobr * cena;
	p = emkost / vsignala / k;
	f1 << "Производительность системы = " << proizvoditelnost << " сигналов / мск " << endl;
	f1 << "Стоимость обработки сигналов  в ЭВМ = " << stoimost << " руб." << endl;
	f1 << "Вероятность переполнения накопителя = " << p << endl;
	f1.close();
	system("Pause");
	//delete MassEVM;
	//delete SvobodnostEVM;
	//delete TimerEVM;
	//delete countSignalEVM;
}
18 фев 21, 12:44    [22282725]     Ответить | Цитировать Сообщить модератору
 Re: Заменить запись в файл с txt на xlsx  [new]
mayton
Member

Откуда: loopback
Сообщений: 51160
В простейшем случае ты можешь переименовать расширение в СSV

f1.open("log.csv", ios_base::trunc);


И логфайл привести к табличному виду с разделителями например ";".

И это Excel должен открыть как табличку.
18 фев 21, 12:50    [22282735]     Ответить | Цитировать Сообщить модератору
 Re: Заменить запись в файл с txt на xlsx  [new]
Dima T
Member

Откуда:
Сообщений: 15597
*.xslx это xml в zip-архиве. Пишешь в xml, затем пакуешь.
Структура xml тут описана.
18 фев 21, 12:52    [22282737]     Ответить | Цитировать Сообщить модератору
 Re: Заменить запись в файл с txt на xlsx  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52504

xamelione25
f1.open("log.txt", ios_base::trunc);
Вот в этой строчке надо ".txt" заменить на ".xlsx".

Ну или читать спецификацию xlsx и переделывать весь вывод согласно ней.

Posted via ActualForum NNTP Server 1.5

18 фев 21, 12:52    [22282738]     Ответить | Цитировать Сообщить модератору
 Re: Заменить запись в файл с txt на xlsx  [new]
xamelione25
Member

Откуда:
Сообщений: 63
Dimitry Sibiryakov,

Dima T,

mayton

гляньте тут, я там писал более подробнее о проблеме с которой я столкнулся
Модератор: Нет. Мы не будем ходить в другие форумы. Это - модераторский совет.


Сообщение было отредактировано: 18 фев 21, 12:50
18 фев 21, 12:56    [22282740]     Ответить | Цитировать Сообщить модератору
 Re: Заменить запись в файл с txt на xlsx  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 2166
xamelione25,

Записывай всё в tsv и не делай себе голову. \t - разделитель полей, \n - строк. Табы в строках меняй на что-нибудь.
18 фев 21, 13:21    [22282760]     Ответить | Цитировать Сообщить модератору
 Re: Заменить запись в файл с txt на xlsx  [new]
xamelione25
Member

Откуда:
Сообщений: 63
crutchmaster, Dimitry Sibiryakov, mayton,

да я уже с csv все решил ... спс))

единственное подскажите как сделать по конечным границам заполненных ячеек в икселе ... по окончанию записи в него ... в csv формате ... выделение всех границ ячеек входящих в этот диапазон

ну например вот так

К сообщению приложен файл. Размер - 164Kb
18 фев 21, 13:29    [22282767]     Ответить | Цитировать Сообщить модератору
 Re: Заменить запись в файл с txt на xlsx  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7740
xamelione25,
В коде надо?
- вкл записи макроса
- выделить
- посмотреть полученный код макроса.
18 фев 21, 14:17    [22282816]     Ответить | Цитировать Сообщить модератору
 Re: Заменить запись в файл с txt на xlsx  [new]
mayton
Member

Откуда: loopback
Сообщений: 51160
crutchmaster
xamelione25,

Записывай всё в tsv и не делай себе голову. \t - разделитель полей, \n - строк. Табы в строках меняй на что-нибудь.

Никогда не понимал этот формат. Табы на просмотре текста выглядят ужасно. Сложно
понять - где пробел в данных а где разделитель. Чтоб трабл-шутить нужно смотреть
вооруженным глазом через hex-editor или среду с подсветкой управляющих символов.
18 фев 21, 14:31    [22282831]     Ответить | Цитировать Сообщить модератору
 Re: Заменить запись в файл с txt на xlsx  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52504

mayton
Табы на просмотре текста выглядят ужасно.

Отлично выглядит если
1) Данные примерно одинаковой длины;
2) Длина не близка в кратности таба.

Posted via ActualForum NNTP Server 1.5

18 фев 21, 14:37    [22282835]     Ответить | Цитировать Сообщить модератору
 Re: Заменить запись в файл с txt на xlsx  [new]
Dima T
Member

Откуда:
Сообщений: 15597
mayton
crutchmaster
xamelione25,

Записывай всё в tsv и не делай себе голову. \t - разделитель полей, \n - строк. Табы в строках меняй на что-нибудь.

Никогда не понимал этот формат. Табы на просмотре текста выглядят ужасно. Сложно
понять - где пробел в данных а где разделитель. Чтоб трабл-шутить нужно смотреть
вооруженным глазом через hex-editor или среду с подсветкой управляющих символов.

Не надо фигней заниматься, открыл в экселе и смотри. CSV намного хуже, где разделитель сам печатный символ, который может содержаться в данных.
18 фев 21, 14:39    [22282838]     Ответить | Цитировать Сообщить модератору
 Re: Заменить запись в файл с txt на xlsx  [new]
mayton
Member

Откуда: loopback
Сообщений: 51160
Вот за что люблю наш форум... Архитекторы сцепились за сплиттер.
18 фев 21, 14:43    [22282841]     Ответить | Цитировать Сообщить модератору
 Re: Заменить запись в файл с txt на xlsx  [new]
mayton
Member

Откуда: loopback
Сообщений: 51160
По сабжу. Если сплиттер == запятая, все нормально экранируется кавычками. И сами кавычки тоже.

"Timestamp,Message"
2021-02-18T16:31:14.417069,"Fucken comma ',' in value"
2021-02-18T16:31:14.4260667,Fucken tab 	 in value
2021-02-18T16:31:14.4260667,"Fucken ""quoted literal"" in value"


Ну а табулятор - невидимка. Вот такие дела.
18 фев 21, 17:33    [22282997]     Ответить | Цитировать Сообщить модератору
 Re: Заменить запись в файл с txt на xlsx  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7740
mayton,

>Ну а табулятор - невидимка. Вот такие дела.
Та мы туда и не смотрим)))
18 фев 21, 19:20    [22283057]     Ответить | Цитировать Сообщить модератору
 Re: Заменить запись в файл с txt на xlsx  [new]
Dima T
Member

Откуда:
Сообщений: 15597
mayton
Вот за что люблю наш форум... Архитекторы сцепились за сплиттер.

Ты теоретик, а мы практики, нае... с этим
18 фев 21, 21:09    [22283108]     Ответить | Цитировать Сообщить модератору
 Re: Заменить запись в файл с txt на xlsx  [new]
mayton
Member

Откуда: loopback
Сообщений: 51160
Вы, практики наверное ничего больше 1 Гига в CSV не грузили в БД.

А я - грузил. И в Excel такой файл не открывался. Вот такие пироги.
18 фев 21, 21:17    [22283111]     Ответить | Цитировать Сообщить модератору
 Re: Заменить запись в файл с txt на xlsx  [new]
Dima T
Member

Откуда:
Сообщений: 15597
mayton
Вы, практики наверное ничего больше 1 Гига в CSV не грузили в БД.

А я - грузил. И в Excel такой файл не открывался. Вот такие пироги.

Ты же не админ, код писать умеешь, зачем тут эксель вообще непонятно.

У меня трижды в день качается 6-8 Гб, превращаю в БД размером 2 Гб, на все 40 минут уходит.
18 фев 21, 21:28    [22283117]     Ответить | Цитировать Сообщить модератору
 Re: Заменить запись в файл с txt на xlsx  [new]
mayton
Member

Откуда: loopback
Сообщений: 51160
Хм.... 8 Гигабайт за 40 минут. Это приблизительно 204 Мб в минуту или 3.4 Мб в секунду.

Медленно-ва-то... Для современных носителей и сетей. Хотя чорт его знает. Вангую что I/O небыстрый.
18 фев 21, 21:38    [22283119]     Ответить | Цитировать Сообщить модератору
 Re: Заменить запись в файл с txt на xlsx  [new]
mayton
Member

Откуда: loopback
Сообщений: 51160
xamelione25,

автор ну что? У тебя получилось CSV открыть в Excel?
18 фев 21, 21:40    [22283120]     Ответить | Цитировать Сообщить модератору
 Re: Заменить запись в файл с txt на xlsx  [new]
Dima T
Member

Откуда:
Сообщений: 15597
mayton
Вангую что I/O небыстрый.

Небыстрый FoxPro, на котором все написано. Но производительность всех устраивает
18 фев 21, 21:41    [22283121]     Ответить | Цитировать Сообщить модератору
 Re: Заменить запись в файл с txt на xlsx  [new]
xamelione25
Member

Откуда:
Сообщений: 63
mayton,
да, открылся...
18 фев 21, 21:43    [22283122]     Ответить | Цитировать Сообщить модератору
 Re: Заменить запись в файл с txt на xlsx  [new]
mayton
Member

Откуда: loopback
Сообщений: 51160
Фокс - хорошая штука. Уважаю. У них интересный тип индекса был. Какой-то там rush.
И на сравнительных тестах если сравнивать dBase vs Fox, то последний выигрывал когда
были запросы специфичны к этому рашу. Интересно Microsoft перенёс это ноу-хау в MS-SQL?

Кто есть MS-SQL-щики? Проясните plz.
18 фев 21, 21:44    [22283124]     Ответить | Цитировать Сообщить модератору
 Re: Заменить запись в файл с txt на xlsx  [new]
ъъъъъ
Member

Откуда:
Сообщений: 1815
mayton
У них интересный тип индекса был. Какой-то там rush.

Без детализации.
Имхо, маркетинговый шит.
18 фев 21, 21:46    [22283125]     Ответить | Цитировать Сообщить модератору
 Re: Заменить запись в файл с txt на xlsx  [new]
bk0010
Member

Откуда:
Сообщений: 5033
mayton
Фокс - хорошая штука. Уважаю. У них интересный тип индекса был. Какой-то там rush.
И на сравнительных тестах если сравнивать dBase vs Fox, то последний выигрывал когда
были запросы специфичны к этому рашу. Интересно Microsoft перенёс это ноу-хау в MS-SQL?
Кто есть MS-SQL-щики? Проясните plz.
Технология Rushmore. То ли сжатые индексы, то ли bitmap (не помню). Подробности тут, искать слово Rushmore.
18 фев 21, 22:11    [22283134]     Ответить | Цитировать Сообщить модератору
 Re: Заменить запись в файл с txt на xlsx  [new]
mayton
Member

Откуда: loopback
Сообщений: 51160
А.. точно.
18 фев 21, 22:20    [22283138]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4 5   вперед  Ctrl      все
Все форумы / C++ Ответить