extratorTXT.cpp
3.56 KB
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
/***************************************************************************
* Universidade Federal da Paraíba *
* Copyright (C) 2014 by Laboratório de Aplicações de Vídeo Digital *
* *
* Centro de Informática - UFPB - Campus I *
* João Pessoa - PB - Brasil *
* *
* Author: Erickson Silva (erickson.silva@lavid.ufpb.br) *
* *
**************************************************************************/
#include "extratorTXT.h"
ExtratorTXT::ExtratorTXT(){
listeners = new list<ListenerTXT*>();
finish = false;
PRINTL(util::_DEBUG, "ExtratorTXT Done!\n");
}
ExtratorTXT::~ExtratorTXT(){
listeners->clear();
delete listeners;
delete file;
delete file_io;
delete bff_reader;
PRINTL(util::_DEBUG, "ExtratorTXT finalized!\n");
}
void ExtratorTXT::addListener(ListenerTXT* listener){
listeners->push_back(listener);
}
void ExtratorTXT::notifyListeners(unsigned char* line) {
for(list<ListenerTXT*>::iterator it = listeners->begin(); it != listeners->end(); it++){
(*it)->notifyLine(line);
}
}
void ExtratorTXT::notifyEndExtraction(int size) {
PRINTL(util::_DEBUG, "ExtratorTXT concluiu a extração: %d linhas.\n", size);
for(list<ListenerTXT*>::iterator it = listeners->begin(); it != listeners->end(); it++){
(*it)->notifyEnd(size);
}
}
void ExtratorTXT::encodingfiletoUTF8() {
string iconvcmd = "iconv -f"; //Recodifica o arquivo para utf-8
iconvcmd.append(" $(file --mime-encoding -b ")
.append(this->filePath).append(") -t utf-8 ")
.append(this->filePath).append(" > ").append(TEMP_TXT);
system(iconvcmd.c_str());
string perlcmd = "perl -p -e 's/\r$//' < "; //Formata a quebra de linha
perlcmd.append(TEMP_TXT).append(" > ").append(this->filePath)
.append(" && rm -f ").append(TEMP_TXT);
system(perlcmd.c_str());
}
void ExtratorTXT::setFilePath(char* path){
this->filePath = path;
encodingfiletoUTF8();
}
void ExtratorTXT::initialize(){
file = new lavidlib::File(filePath);
try{
file_io = new lavidlib::FileIO(file->getPath(), FileIO::MODE_READ);
bff_reader = new BufferedReader(file_io);
}catch(Exception &ex){
finish = true;
Logging::instance()->writeLog("extratorTXT.cpp <Error>: Arquivo de texto não encontrado.");
throw ExtratorException("Falha ao abrir o arquivo de texto! Verifique se o mesmo existe.");
}
this->Start();
}
bool ExtratorTXT::isFinished(){
return finish;
}
void ExtratorTXT::Run(){
PRINTL(util::_INFO, "Extraindo Texto...\n");
int line_index = 0;
bool hasNext = true;
string line;
while (hasNext) {
try{
line = bff_reader->readLine();
if (line.length() > 0){
notifyListeners((unsigned char*) line.c_str());
line_index++;
}
}catch (EOFException &ex){
if(line_index == 0)
notifyListeners((unsigned char*)"ARQUIVO_INVALIDO");
hasNext = false;
}catch (...){
Logging::instance()->writeLog("extratorTXT.cpp <Error>: Erro durante a leitura do arquivo de texto.");
throw ExtratorException("Falha desconhecida na leitura do arquivo. Tente novamente.");
}
}
finish = true;
notifyEndExtraction(line_index);
}