String Buffer = "";
yanlou
Messages postés
119
Statut
Membre
-
Posotaz Messages postés 505 Statut Membre -
Posotaz Messages postés 505 Statut Membre -
salut
j'ai un fichier .csv qui contient 27000 ligne et je veux suprrimer les ligne 4,5,6
ça fonction avec le code que j'ai mais ça prend presque 2min pour s'exécuté
y'a t'il unmoyenne pour minimiser le temps de l'execution
#include <string>
#include <fstream>
void Erase_Line1(char* z, int Line_to_Erase)
{
std::string Buffer = ""; //Variable contenant le texte à réécrire dans le fichier
std::ifstream ReadFile( z);
if (ReadFile) //Si le fichier est trouvé
{
std::string line;
int Line = 0;
while ( std::getline( ReadFile, line ) ) //on parcours le fichier et on initialise line à la ligne actuelle
{
Line++;
if(Line != Line_to_Erase) //Si la ligne atteinte est différente de la ligne à supprimer...
Buffer += line + "\n"; //On ajoute le contenu de la ligne dans le contenu à réécrire
}
}
ReadFile.close(); //On ferme le fichier en lecture
std::ofstream WriteFile( z); //On ouvre ce même fichier en écriture
WriteFile << Buffer; //On écris le texte dedans
WriteFile.close(); //et on ferme le fichier
}
int main()
{
Erase_Line1("z.txt", 4);
Erase_Line1("z.txt", 4);
Erase_Line1("z.txt", 4);
return 0;
}
j'ai un fichier .csv qui contient 27000 ligne et je veux suprrimer les ligne 4,5,6
ça fonction avec le code que j'ai mais ça prend presque 2min pour s'exécuté
y'a t'il unmoyenne pour minimiser le temps de l'execution
#include <string>
#include <fstream>
void Erase_Line1(char* z, int Line_to_Erase)
{
std::string Buffer = ""; //Variable contenant le texte à réécrire dans le fichier
std::ifstream ReadFile( z);
if (ReadFile) //Si le fichier est trouvé
{
std::string line;
int Line = 0;
while ( std::getline( ReadFile, line ) ) //on parcours le fichier et on initialise line à la ligne actuelle
{
Line++;
if(Line != Line_to_Erase) //Si la ligne atteinte est différente de la ligne à supprimer...
Buffer += line + "\n"; //On ajoute le contenu de la ligne dans le contenu à réécrire
}
}
ReadFile.close(); //On ferme le fichier en lecture
std::ofstream WriteFile( z); //On ouvre ce même fichier en écriture
WriteFile << Buffer; //On écris le texte dedans
WriteFile.close(); //et on ferme le fichier
}
int main()
{
Erase_Line1("z.txt", 4);
Erase_Line1("z.txt", 4);
Erase_Line1("z.txt", 4);
return 0;
}
3 réponses
J'ai le même pb de temps d'éxécution avec ungros fichier CSV dans lequel je supprime les 3/4 des enregistrements, ca mouline en mémoire mais le travail est correct a la sortie.
Salut,
Qu'est-ce qui prend du temps ? La lecture du fichier ou l'écriture ? Si j'auto-réponds à cette question je remarque que si dans ton code, l'écriture se fait en une seule fois au moyen d'un buffer, lors de la lecture le getline() va lire physiquement sur le fichier à chaque fois (ce qui prend du temps).
Ca fait longtemps que je ne fais plus de C++ mais je te suggère l'utilisation d'une fonction style fread() qui est normalement capable de lire un fichier en une seule fois pour placer son contenu dans un buffer que tu pourras parcourir... mais avec peut-être moins de facilités.
Qu'est-ce qui prend du temps ? La lecture du fichier ou l'écriture ? Si j'auto-réponds à cette question je remarque que si dans ton code, l'écriture se fait en une seule fois au moyen d'un buffer, lors de la lecture le getline() va lire physiquement sur le fichier à chaque fois (ce qui prend du temps).
Ca fait longtemps que je ne fais plus de C++ mais je te suggère l'utilisation d'une fonction style fread() qui est normalement capable de lire un fichier en une seule fois pour placer son contenu dans un buffer que tu pourras parcourir... mais avec peut-être moins de facilités.