PDA

Visualizza la versione completa : [c++] trasformare l'elaborazione di stringhe in elaborazione di interi


freetom
05-02-2013, 11:37
Buongiorno a tutti/e esperti/e di c++ e non (come il sottoscritto) :zizi:
Riprendendo in mano dopo molto tempo alcuni programmi realizzati sempre a scopo lotto ludico grazie alle vostre numerose dritte e preziosi aiuti (primo fra tutti il mitico oregon) mi sono cimentato in un'impresa titanica di leggere un file txt di ben 600 mb (che non apre nessun programma di editor testi) e di volerlo valutare appunto per ritardi e presenze ecc.. Il file in questione infatti contiene ben 43.949.268 cinquine :mame: Ora il programma che sotto riporter˛ Ŕ alquanto da smussare... perchŔ se funziona benissimo per un numero di estrazioni contenuto... (ad es. 30.000) comincia ad annaspare quando si parla di milioni di righe... Penso che dipenda sopratutto dalla sua struttura a base di stringhe e non di interi. E quindi vi chiederei,fosse possibile, di dirmi come poter trasformare il tutto in un elaborato molto + efficiente di interi... Basti pensare che al momento per elaborare una cinquina ci mette oltre 1 minuto... Il che rende qualsiasi elaborazione in tal senso un'operazione temporalmente impossibile... Grazie a tutti/e :ciauz:




#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
#include <sstream>
#include <iomanip>
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <cstring>



using namespace std;

string intToString(int value) {
stringstream ss;
ss << value;
return ss.str();
}

string floatToString(float value) {
stringstream ss;
ss << value;
return ss.str();
}


int main (int argc, char *argv[]) {

vector<string> vec;

int contaterzina=0;

int contatore=0;
int conteggio=0;
int presenze=0;
int presenze3=0;

int contaxambo=0;

int contaestrazioni=0;

int conteggio2=0;


vector<int> ritardi;
vector<int> ritardi2;

vector<string> terzineconritardi;
vector<string> terzineconritardi2;


int contacolpibuoni=0;


string rapportorars2;
string contaestrazioni2;
string colpirimanenti2;
string ritardomassimo2;
string ritardoultimo2;
string presenze2;


ofstream filedisfogo;

filedisfogo.open("filedisfogo.txt", ios::in);

int contasecondi;


//per convertire intero a stringa



//int main() {
// string stringa;
// stringa = intToString(10);
// cout<<stringa;

// return 0;
//}

//-------------------------------


//cin.get();

cout << "\nElaborazione in corso...";
cout << "\nRichiedera' molto tempo...";
cout << "\nTrattandosi di 80000 estrazioni ca";
cout << "\ne di 43 milioni di cinquine ca...";
cout << "\nSiate molto pazienti...";
cout << "\nGrazie";

cout << "\n\nCinquine elaborate: ";


ifstream fin("CINQUINE-GRUPPO-DESIDERATO.txt");
if (fin) {
string s;
while(fin) // cattura tutti gli errori.
{
getline(fin,s);

//cout << s;
vec.push_back(s);
}
}

int sz = vec.size()-1;


for (int x=0; x<sz; x++) {

filedisfogo << vec[x];
delete ("filedisfogo.txt");

}

vector<string> vec2;

int contatore2=0;

ifstream f2in("ESTRAZIONI.txt");
if (f2in) {
string s;
while(f2in) // cattura tutti gli errori.
{
getline(f2in,s);

//cout << s;
vec2.push_back(s);
}
}

int sz2 = vec2.size()-1;


for (int x=0; x<sz2; x++) {


filedisfogo << vec2[x];
delete ("filedisfogo.txt");

}


for (int z=0; z<sz; z++) {

contasecondi++;



//cout << vec[z];
contaterzina++;

//prova scomposizione di ogni stringa... nell'array1 (TERZINE)

string testo,estratta;

vector<string> token;

int inizio,fine,i,lparola;
bool continua;

testo = vec[z];

continua = true;
inizio = -1; /*1*/
while(continua){

fine = testo.find(',',inizio+1); /*2*/


if(fine==-1){ /*3*/
continua = false;
fine = testo.length(); /*4*/
}

// Estrazione parola

lparola = (fine-inizio)-1; /*5*/
estratta = testo.substr(inizio+1,lparola); /*6*/
token.push_back(estratta); /*7*/

inizio = fine; /*8*/
}



for (int z2=0; z2<sz2; z2++) {



//cout << "\n\n";
filedisfogo << vec2[z2];
delete ("filedisfogo.txt");
//cout << "\n\n";


//prova scomposizione di ogni stringa... nell'array1

string testo2,estratta2;

vector<string> token2;

int inizio2,fine2,x,lparola2;
bool continua2;

testo2 = vec2[z2];


continua2 = true;
inizio2 = -1; /*1*/

while(continua2){

fine2 = testo2.find(',',inizio2+1); /*2*/

// ultima parola

if(fine2==-1){ /*3*/
continua2 = false;
fine2 = testo2.length(); /*4*/
}

// Estrazione parola

lparola2 = (fine2-inizio2)-1; /*5*/
estratta2 = testo2.substr(inizio2+1,lparola2); /*6*/
token2.push_back(estratta2); /*7*/

inizio2 = fine2; /*8*/
}

// Elenco parole


for(x=0;x<token2.size();x++)

//cout << "\n\n";
//cout << token2.at(x) << endl;
filedisfogo << token2.at(x) << endl;
delete ("filedisfogo.txt");



//CONTROLLO EVENTUALI VALORI UGUALI E AGGIORNAMENTO INDICI RELATIVI xE (conteggio) e xA (conteggio2)..

int contaxambo=0;

for (int y=0; y<token2.size();y++) {

for (x=0; x<token.size();x++) {


//string token9 = token2.at(19).substr(0, token2.at(19).length()-1);

//cout << "\n";


if (token2.at(y)==token.at(x)) {

contaxambo++;



}

else

{



}




}



}


if (contaxambo > 1) {

//cout << "AMBO SCOVATO!";
presenze++;
conteggio=0;
ritardi.push_back(conteggio);


} else {

conteggio++;
ritardi.push_back(conteggio);


}


//individuazione valore maximo
vector<int>::iterator max;
max = max_element(ritardi.begin(), ritardi.end());

int ritardomassimo =*max;
//----------------------------

//individuazione valore ultimo
int ritardoultimo = ritardi[ritardi.size()-1];
//--------------------------------------------

//individuazione colpirimanenti

int colpirimanenti = *max-(ritardi[ritardi.size()-1]);



if (ritardoultimo>90) {

colpirimanenti2 = intToString(colpirimanenti);
ritardomassimo2 = intToString(ritardomassimo);
ritardoultimo2 = intToString(ritardoultimo);

contaestrazioni2 = intToString(contaestrazioni);
presenze2 = intToString(presenze);




string stringariassuntiva = "presenze: "+presenze2+" combinazione: "+testo+" ra: "+ritardoultimo2;



terzineconritardi.push_back(stringariassuntiva);

}

}


cout << contasecondi;

ofstream fout;

fout.open("RITARDI-A-TUTTELECINQUINE-vs-TUTTE-UNITE.txt", ios::app);


//DATO ULTIMO DELLA TERZINA ANALIZZATA...
string datoultimoterzina= terzineconritardi[terzineconritardi.size()-1];



fout << datoultimoterzina;
fout << "\n";



contaestrazioni=0;
presenze=0;
presenze3=0;
conteggio=0;
conteggio2=0;
ritardi.clear();
ritardi2.clear();
terzineconritardi.clear();


//----------------------------------------------------

}


//------------------------------------------------------


cout << "\n\n\n";

cout << "Press ENTER to continue...x CHIUDERE..." << endl;
cout << "\n\n\n";
cin.get();
//return 0;


}

Loading