Kolejne pytanie. Otóż zrobiłem program, który wczytuje z pliku csv dane oddzielone przecinkiem.
Jak dodać filtrowanie tak, aby po wpisaniu danego ciągu znaków oraz zaznaczeniu po czym ma filtrować program automatycznie wczytał tylko rekordy zawierające owy ciąg znaków???
Możecie mi pomóc?
EDIT
W sumie już nie ważne.
Przesiadłem się na Delphi 6, gdzie bez problemów działa mi pakiet INDY, który rozwiązuje wszystkie inne problemy, natomiast chwilowo tworzy te, które już rozwiązałem.
Czy mógłby mi ktoś powiedzieć jak powinienem przepisać poniższy kod, aby miało to sens (ręce i nogi). Sorki, że o tyle proszę, ale naprawdę nie wiem z której strony ugryźć tego orzecha ;)
#include <fstream>
#include <iostream>
#include <conio.h>
#include <string.h>
#include <utility>
#include <string>
#include <stdio.h>
#include <time.h>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <Windows.h>
#include <vector>
using namespace std;
//deklaracje wszystkich funkcji występujących w programie
void kom010(const char * PLIK);
void kom013(const char * PLIK);
void kom015(const char * PLIK);
void kom030(const char * PLIK);
void czyszczenie(const char * PLIK);
void menu(string typ, const char * PLIK);
void zapisz();
void zapisz030();
int obliczLoop(int koniec);
string Output_file(string HEADR);
//deklaracje ziennych globalnych występujących w programie
HANDLE kolor;
string line;
string HEADER,HEADR,HDRTPITI,HDRNTRAS,HDRNRECO,HDRCDMAG,HDRMITTE,HDRDTTRX,HDRORTRX;
string Rekord[99],wynik[99],wynikUZP[99],wynik2[99],UZUPEL,nazwa,typ,odczyt,PLIK,format=".txt";
int rekordy=0,koniec=0,i=0,linie=0,ile=0,ile2=0,loop=0,loop2=0,uzup=15;
//pobranie aktualnej daty oraz czasu z systemu
pair<string, string> czas()
{
string DTBLE, TIME;
time_t rawtime;
struct tm * timeinfo;
char buffer [80];
time (&rawtime);
timeinfo = localtime (&rawtime);
strftime (buffer,80,"%Y%m%d%H%M%S",timeinfo);
string data(buffer);
string nowa;
DTBLE=data.substr(2,6);
TIME=data.substr(8,6);
return make_pair(DTBLE, TIME);
}
//deklaracja klasy Moduly, obslugujaca wszystkie zmienne modułowe w programie
class Moduly{
public:
string TPITI,SEMOV,CDMAG,MODAM,TELAC,FIL10,CNTER,NRVEN,COLLO,CDCOL,DESC1,DTMER,VINNO,DADOC,PESNE,LPCAR,MZZTR,FIL15;
string PREIM,FLCEE,ENGIN,LNPRD,CDFOA,SRCAR,PESLO,CDCLM,INSAM,ININD,CAIND,LOIND,PRIND,CDNAZ,CDCL2,DESAS,DOGAN,NRBLE;
string DESCL,NTORB,CDMA2,RAIND,CDNA2,ASVEF,I2IND,I2IN2,RRQNR,RRQDT,OUTFL,NRIN2,RAIN2,ININ2,CAIN2,LOIN2,PRIN2,CTRNO;
string NORSD,DTCOC,LPCUS,VECST,MODPV,DORSD,CDVAL,NRPRG,NRFTF,TPASS,DAPCN,FREAM,NRIND,NRBOG,DABOG,CDCLI,ORPTY;
};
//główna funkcja programu
int main(){
system("cls");
kolor = GetStdHandle( STD_OUTPUT_HANDLE );
SetConsoleTextAttribute( kolor, 10 );
pair<string, string> bar = czas();
cin.clear();
cout<<"Plik: ";
SetConsoleTextAttribute( kolor, 14 );
cin>>odczyt;
if(odczyt=="!"){
return 0;
}
if(odczyt=="?"){
informacje();
getch();
main();
}
else{
PLIK=odczyt+format;
czyszczenie(PLIK.c_str());
fstream plik (PLIK.c_str(), ios::in);
if(plik.good()==false){
SetConsoleTextAttribute( kolor, 12 );
system("cls");
cout<<"Plik: "<<PLIK.c_str()<<" nie istnieje";
SetConsoleTextAttribute( kolor, 10 );
getch();
main();
}else{
do
{
getline(plik, line);
linie=linie+1;
}
while(!plik.eof());
plik.close();
typ=line.substr(0,4);
rekordy=linie-1;
menu(typ, PLIK.c_str());
}
}
}
//funkcja "czyszczące" plik wejściowy z nie potrzebnych treści
void czyszczenie(const char * PLIK){
ifstream input(PLIK);
string tmp,HEADR;
vector<string> goodLines;
fstream wczytaj_HEADR (PLIK, ios::in);
getline(wczytaj_HEADR, HEADR);
while (getline(input, tmp))
{
if (tmp.substr(0,4)=="010+" || tmp.substr(0,4)=="013+" || tmp.substr(0,4)=="030+")
{
goodLines.push_back(tmp);
}
}
input.close();
ofstream output(PLIK);
output<<HEADR;
for (size_t i=0;i<goodLines.size();++i)
{
output<<endl;
output<<goodLines[i];
}
}
//funkcja menu, uruchamiająca odpowiednią do komunikatu funkcję
void menu(string typ, const char * PLIK){
if(typ=="010+"){
kom010(PLIK);
obliczLoop(koniec);
zapisz();
}
if(typ=="013+"){
kom013(PLIK);
obliczLoop(koniec);
zapisz();
}
if(typ=="015+" || typ=="015-"){
kom015(PLIK);
obliczLoop(koniec);
zapisz();
}
if(typ=="030+"){
kom030(PLIK);
obliczLoop(koniec);
zapisz030();
}
}
//funkcja obliczająca ilość znaków do uzupełnienia
int obliczLoop(int koniec){
ile=(int)log10(koniec)+1;
loop=5-ile;
return loop;
}
//funkcja zapisująca zawartość TYLKO dla komunikatu 030
void zapisz030(){
pair<string, string> bar = czas();
fstream plik2 (nazwa.c_str(), ios::out);
plik2<<"HDR"<<HDRTPITI<<UZUPEL;
for (int i=0;i<loop;i++){
plik2<<"0";
}
plik2<<koniec<<" CAT2W "<<bar.first<<bar.second<<"\n";
for (int i=0;i<rekordy;i++){
plik2<<wynik[i];
}
for (int i=0;i<rekordy;i++){
plik2<<wynik2[i];
}
}
//funkcja zapisujące zawartość reszty komunikatów
void zapisz(){
pair<string, string> bar = czas();
fstream plik2 (nazwa.c_str(), ios::out);
plik2<<"HDR"<<HDRTPITI<<UZUPEL;
for (int i=0;i<loop;i++){
plik2<<"0";
}
plik2<<koniec<<" CAT2W "<<bar.first<<bar.second<<"\n";
for (int i=0;i<rekordy;i++){
plik2<<wynik[i];
}
}
//funkcja generująca nazwę pliku wyjściowego
string Output_file(string HEADR)
{
HDRTPITI=HEADR.substr(3,5);
nazwa="CAT"+HDRTPITI+".txt";
return nazwa;
}
//funkcja obsługująca komunikat 010
void kom010(const char * PLIK){
pair<string, string> bar = czas();
fstream plik3 (PLIK, ios::in);
while(!plik3.eof()){
getline(plik3, HEADR);
Output_file(HEADR);
for (int i=0;i<rekordy;i++){
Moduly Modul;
getline(plik3, Rekord[i]);
Modul.TPITI=Rekord[i].substr(0,3);
Modul.SEMOV=Rekord[i].substr(3,1);
Modul.CDMAG=Rekord[i].substr(4,2);
Modul.MODAM=Rekord[i].substr(6,15);
Modul.TELAC=Rekord[i].substr(21,6);
Modul.FIL10=Rekord[i].substr(27,13);
Modul.CNTER=Rekord[i].substr(40,12);
Modul.NRVEN=Rekord[i].substr(52,10);
Modul.COLLO=Rekord[i].substr(62,6);
Modul.CDCOL=Rekord[i].substr(68,3);
Modul.DESC1=Rekord[i].substr(71,15);
Modul.VINNO=Rekord[i].substr(92,17);
Modul.NRFTF=Rekord[i].substr(115,11);
Modul.CDVAL=Rekord[i].substr(126,3);
Modul.PREIM=Rekord[i].substr(129,11);
Modul.FLCEE=Rekord[i].substr(140,1);
Modul.ENGIN=Rekord[i].substr(141,18);
Modul.LNPRD=Rekord[i].substr(159,1);
Modul.CDFOA=Rekord[i].substr(160,6);
Modul.SRCAR=Rekord[i].substr(166,1);
Modul.PESLO=Rekord[i].substr(167,7);
Modul.CDCLM=Rekord[i].substr(174,3);
Modul.INSAM=Rekord[i].substr(177,17);
Modul.FREAM=Rekord[i].substr(194,17);
Modul.PESNE=Rekord[i].substr(211,7);
wynik[i]="040"+Modul.SEMOV+Modul.CDMAG+Modul.MODAM+Modul.TELAC+bar.first+" "+bar.first+Modul.VINNO+Modul.LNPRD+" \n";
}
koniec=rekordy+1;
}
}
//funkcja obsługująca komunikat 013
void kom013(const char * PLIK){
pair<string, string> bar = czas();
fstream plik3 (PLIK, ios::in);
while(!plik3.eof()){
getline(plik3, HEADR);
Output_file(HEADR);
for (int i=0;i<rekordy;i++){
Moduly Modul;
getline(plik3, Rekord[i]);
Modul.TPITI=Rekord[i].substr(0,3);
Modul.SEMOV=Rekord[i].substr(3,1);
Modul.LNPRD=Rekord[i].substr(4,1);
Modul.MODAM=Rekord[i].substr(5,15);
Modul.TELAC=Rekord[i].substr(20,6);
Modul.VINNO=Rekord[i].substr(26,17);
Modul.DESCL=Rekord[i].substr(43,40);
Modul.NTORB=Rekord[i].substr(83,1);
Modul.CDMA2=Rekord[i].substr(84,2);
Modul.CDCLI=Rekord[i].substr(86,6);
Modul.NRIND=Rekord[i].substr(92,2);
Modul.RAIND=Rekord[i].substr(94,35);
Modul.ININD=Rekord[i].substr(129,35);
Modul.CAIND=Rekord[i].substr(164,9);
Modul.LOIND=Rekord[i].substr(173,20);
Modul.PRIND=Rekord[i].substr(193,2);
Modul.CDNAZ=Rekord[i].substr(195,3);
Modul.CDMAG=Rekord[i].substr(198,2);
Modul.CDCL2=Rekord[i].substr(200,6);
Modul.NRIN2=Rekord[i].substr(206,2);
Modul.RAIN2=Rekord[i].substr(208,35);
Modul.ININ2=Rekord[i].substr(243,35);
Modul.CAIN2=Rekord[i].substr(278,9);
Modul.LOIN2=Rekord[i].substr(287,20);
Modul.PRIN2=Rekord[i].substr(307,2);
Modul.CDNA2=Rekord[i].substr(309,3);
Modul.ASVEF=Rekord[i].substr(312,1);
Modul.I2IND=Rekord[i].substr(313,35);
Modul.I2IN2=Rekord[i].substr(348,35);
Modul.RRQNR=Rekord[i].substr(383,7);
Modul.RRQDT=Rekord[i].substr(390,10);
Modul.OUTFL=Rekord[i].substr(391,1);
Modul.CDCOL=Rekord[i].substr(394,3);
Modul.CDCLM=Rekord[i].substr(397,3);
wynik[i]="014"+Modul.SEMOV+Modul.LNPRD+Modul.MODAM+Modul.TELAC+Modul.VINNO+bar.first+" "+Modul.CDMAG+Modul.CDCL2;
}
koniec=rekordy+1;
}
}
//funkcja obsługująca komunikat 030
void kom030(const char * PLIK){
pair<string, string> bar = czas();
fstream plik3 (PLIK, ios::in);
while(!plik3.eof()){
getline(plik3, HEADR);
Output_file(HEADR);
for (int i=0;i<rekordy;i++){
Moduly Modul;
getline(plik3, Rekord[i]);
Modul.TPITI=Rekord[i].substr(0,3);
Modul.SEMOV=Rekord[i].substr(3,1);
Modul.CDMAG=Rekord[i].substr(4,2);
Modul.MODAM=Rekord[i].substr(6,15);
Modul.TELAC=Rekord[i].substr(21,6);
Modul.DESCL=Rekord[i].substr(27,40);
Modul.TPASS=Rekord[i].substr(67,1);
Modul.DESAS=Rekord[i].substr(68,30);
Modul.VINNO=Rekord[i].substr(98,17);
Modul.MZZTR=Rekord[i].substr(115,4);
Modul.NTORB=Rekord[i].substr(119,1);
Modul.LNPRD=Rekord[i].substr(120,1);
Modul.ORPTY=Rekord[i].substr(121,1);
Modul.NRPRG=Rekord[i].substr(122,7);
Modul.DAPCN=Rekord[i].substr(129,6);
Modul.LPCAR=Rekord[i].substr(135,2);
Modul.CDCOL=Rekord[i].substr(137,3);
Modul.CDCLM=Rekord[i].substr(140,3);
wynik[i]="022"+Modul.SEMOV+Modul.CDMAG+Modul.VINNO+bar.first+Modul.LNPRD+Modul.NRPRG+"\n";
wynik2[i]="060"+Modul.SEMOV+Modul.CDMAG+Modul.MODAM+Modul.TELAC+bar.first+Modul.DAPCN+" "+Modul.VINNO+Modul.LNPRD+" "+Modul.NRPRG+"\n";
}
koniec=(rekordy*2)+1;
}
}
//funkcja obsługująca komunikat 015
void kom015(const char * PLIK){
pair<string, string> bar = czas();
fstream plik3 (PLIK, ios::in);
while(!plik3.eof()){
getline(plik3, HEADR);
Output_file(HEADR);
for (int i=0;i<rekordy;i++){
Moduly Modul;
getline(plik3, Rekord[i]);
Modul.TPITI=Rekord[i].substr(0,3);
Modul.SEMOV=Rekord[i].substr(3,1);
Modul.CDMAG=Rekord[i].substr(4,2);
Modul.MODAM=Rekord[i].substr(6,15);
Modul.TELAC=Rekord[i].substr(21,6);
Modul.FIL15=Rekord[i].substr(27,13);
Modul.CNTER=Rekord[i].substr(40,12);
Modul.NRVEN=Rekord[i].substr(52,10);
Modul.COLLO=Rekord[i].substr(62,6);
Modul.CDCOL=Rekord[i].substr(68,3);
Modul.DESC1=Rekord[i].substr(71,15);
Modul.ENGIN=Rekord[i].substr(86,18);
Modul.LNPRD=Rekord[i].substr(104,1);
Modul.VINNO=Rekord[i].substr(105,17);
//wynik[i]="040"+SEMOV[i]+CDMAG[i]+MODAM[i]+TELAC[i]+DTBLE[i]+NRBLE[i]+DTARR[i]+VINNO[i]+LNPRD[i]+CTRNO[i]+"\n";
wynik[i]="040"+Modul.SEMOV+Modul.CDMAG+Modul.MODAM+Modul.TELAC+bar.first+Modul.NRBLE+bar.first+Modul.LNPRD+Modul.CTRNO+"\n";
}
koniec=(rekordy*2)+1;
}
}