Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

import tab delimited file u interbase

[es] :: C/C++ programiranje :: import tab delimited file u interbase

[ Pregleda: 1827 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

darko_sudarov
ProConto Software doo
Kikinda

Član broj: 89262
Poruke: 136
212.200.34.*



Profil

icon import tab delimited file u interbase10.04.2007. u 09:15 - pre 207 meseci
Zna li neko resenje ovog problema-
BCB6-kod za import tab delimited file
baza-InterBase
Naime sve na oko radi savrseno do dela kada treba da prebaci podatke u bazu :-(

Code:

int j =1, duzina;
AnsiString f, string="";
if (uvoz->Execute() )
{

f=uvoz->FileName;
memo->Lines->LoadFromFile(f);
//uvoz je TOpenDialog
//memo je TMemo
//Sve radi on click

}

for(int i=0; i<= memo->Lines->Count; i++){

   duzina=memo->Lines->Strings[i].Length();

   while (j <= duzina) {

       if(memo->Lines->Strings[i].SubString(j,1) != '\t'   ) {
          string =  string + memo->Lines->Strings[i].SubString(j,1);
       }
       else  {
        ShowMessage (string);
        string="";
//ovo sve odradi bez problema i pokaze tacno polj koja mi trebaju-nastavaj izbaci gresku EConvertError with message ''' is not valid number
//dm->cdskasastavke->Append();
//dm->cdskasastavke->FieldValues["ARTIKAL_SIFRA"]= StrToInt(string="") ;
//dm->cdskasastavke->FieldValues["ID"] = 1;
//dm->cdskasastavke->FieldValues["VEZA"] = dm->cdskasastavke->RecordCount;
//dm->cdskasastavke->FieldValues["ARTIKAL_SIFRA"] = StrToInt(string="");
//dm->cdskasastavke->FieldValues["OPIS"] = StrToBool (string="") ;
//dm->cdskasastavke->FieldValues["CENAIZKASE"] = StrToFloat (string="");
//dm->cdskasastavke->FieldValues["KOLICINA"] = StrToFloat (string="");
//dm->cdskasastavke->Post();
       }

       j++;

    }

   j=1;
  ShowMessage (string);
 string="";
//takodje greska
//dm->cdskasastavke->Insert();
//dm->cdskasastavke->FieldValues["IZNOS"] = StrToFloat (string="");
//dm->cdskasastavke->Post();
}
}

EDIT: X Files : Molim Vas da zbog preglednosti, kod upisujete između tag-ova predviđenih za to:

[code]
int main ( int argc, char *argv[] )
{
// ...
return 0;
}
[/code]


[Ovu poruku je menjao X Files dana 10.04.2007. u 10:45 GMT+1]
 
Odgovor na temu

savkic
Igor Savkić

Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: import tab delimited file u interbase10.04.2007. u 09:41 - pre 207 meseci
> string="";
//ovo sve odradi bez problema i pokaze tacno polj koja mi trebaju-nastavaj izbaci gresku EConvertError with message ''' is not valid number
//dm->cdskasastavke->Append();
//dm->cdskasastavke->FieldValues["ARTIKAL_SIFRA"]= StrToInt(string="") ;

Sve je rečeno u opisu greške, pokušavaš da pretvoriš prazan string u broj, čemu ti služi string="" na početku bloka i prilikom konverzije?
FieldValues je tipa Variant tako da i ne moraš sam izričito raditi konverziju. Ako ti je bitna brzina, dodela variant vrednosti nije najbolje rešenje, takođe ni pretraga polja po nazivu. Bolje je koristiti pristup poljima po indeksu i dodelu prema tipu polja, AsString, AsInteger, AsFloat.
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.tekostolac.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: import tab delimited file u interbase10.04.2007. u 09:51 - pre 207 meseci
Koliko odokativno vidim, imaš još jednu anomaliju u kodu:
Umesto:
Citat:

Code:

for(int i=0; i<= memo->Lines->Count; i++){


Trebalo bi:
Code:

// umesto <= treba <
for(int i=0; i<memo->Lines->Count; i++){

Jer u C++ indeksi idu od NULE, pa moraš kraj domena da umanjiš za jedan.

 
Odgovor na temu

darko_sudarov
ProConto Software doo
Kikinda

Član broj: 89262
Poruke: 136
212.200.34.*



Profil

icon Re: import tab delimited file u interbase10.04.2007. u 13:06 - pre 207 meseci
probao sam i dm->cdskasastavke->FieldByName("ARTIKAL_SIFRA")->AsInteger = StrToInt(string) ; ali nece ni onda,mada mi se cini da ako ovako radim u stvari sabiram polja koja su odvojena tabom..
npr ako je 1\t1.25\tdarko\t0.25 on procita 1 ali u sledece polje pokusa da upise 11.25 pa 11.25darko itd...,ne razumem sta mi je ciniti dok sa ShowMessage prikazuje lepo.
inace string="" je velika greska.Takodje i <= . Zahvalan sam na pomoci,kako dalje da izvedem ovo do kraja?
 
Odgovor na temu

savkic
Igor Savkić

Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: import tab delimited file u interbase10.04.2007. u 13:34 - pre 207 meseci
> probao sam i dm->cdskasastavke->FieldByName("ARTIKAL_SIFRA")->AsInteger =
> StrToInt(string) ; ali nece ni onda,mada mi se cini da ako ovako radim u
> stvari sabiram polja koja su odvojena tabom..

Ako neće, kaži šta se dešava, da li dobiješ grešku (i koju) ... Ovo za sabiranje nisam ni razumeo.

> npr ako je 1\t1.25\tdarko\t0.25 on procita 1 ali u sledece polje pokusa da upise
> 11.25 pa 11.25darko itd...,ne razumem sta mi je ciniti dok sa
> ShowMessage prikazuje lepo.

Najpre tebi parsovanje nije dobro, kako si uradio jednu istu vrednost upisuješ u sva polja. Najlakše je ovako:
Code:

Petlja 1
  Uzmeš jedan red iz teksta
  Dodela vrednosti svakom od polja, napravićeš jednu dodatnu funkcija koja razdvaja red na
  sastavne delove (tokene). Dakle, pretražuje karakter po karakter dok ne naiđe na tab (ili 
  kraj stringa), sadržaj pre taba vrati kao rezultat, iz stringa obriše taj vraćeni deo.

   Polje1.AsInteger := StrToInt(GetToken(Red));
   Polje2.AsString := GetToken(Red);
   Polje3.AsFloat  := StrToFloat(GetToken(Red));
   ...




 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: import tab delimited file u interbase10.04.2007. u 15:29 - pre 207 meseci
Probaj nešto ovako (stari kod koji sam koristio za nesto slicno):

// neki headeri i definicije
Code:

#include <StrUtils.hpp>
#define MAX_COLUMNS 1000


// 7 je broj KOLONA koje želiš da razdvojiš (dakle ima 7-1 tabova)
Code:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   ExtractTabs( memo->Lines, 7 );
}


Code:

void TForm1::ExtractTabs( TStrings *S, int Columns )
{
   if ( ( !S ) || ( Columns<1 || Columns>MAX_COLUMNS-1 ) )
      return;

   int TabsCount;
   int TabPositions[MAX_COLUMNS-1];
   AnsiString ExtractedFragment[MAX_COLUMNS];

   for ( int i=0; i<S->Count; i++ )
   {
      TabsCount = -1;
      for ( int j=1; j<=S->Strings[i].Length(); j++ )
      {
         if ( S->Strings[i][j] == '\t' )
         {
            if ( ++TabsCount > Columns )
               break;
            TabPositions[ TabsCount ] = j;
            //ShowMessage ( IntToStr( TabPositions[ TabsCount ] ) );
         }
      }

      if ( ( TabsCount+2 ) != Columns )
         continue;

      // Prva kolona
      ExtractedFragment[0] = MidStr( S->Strings[i], 1, TabPositions[0]-1 );
      // Sredisnje
      for ( int k=1; k<TabsCount+1; k++ )
         ExtractedFragment[k] = MidStr( S->Strings[i], TabPositions[k-1]+1, TabPositions[k]-TabPositions[k-1]-1 );
      // Poslednja
      ExtractedFragment[TabsCount+1] = MidStr( S->Strings[i], TabPositions[TabsCount]+1, S->Strings[i].Length()-TabPositions[TabsCount] );

      // Ovde su poredjani izolovani elementi: ExtractedFragment[0] .. ExtractedFragment[Columns-1]
      // proba:
      // for ( int l=0; l<Columns; l++ )
      //    ShowMessage( ExtractedFragment[l] );

      // dakle, dalje kako ti je savkic rekao /PSEUDO/:
      Polje1->AsInteger = StrToInt( ExtractedFragment[0] );
      Polje2->AsString = ExtractedFragment[1];
      Polje3->AsFloat  = StrToFloat( ExtractedFragment[2] );
      // ... itd ...
   }
}


 
Odgovor na temu

darko_sudarov
ProConto Software doo
Kikinda

Član broj: 89262
Poruke: 136
212.200.34.*



Profil

icon Re: import tab delimited file u interbase11.04.2007. u 08:04 - pre 207 meseci
Probano i radi!!!!
HVALA NA POMOCI :-)))))
 
Odgovor na temu

[es] :: C/C++ programiranje :: import tab delimited file u interbase

[ Pregleda: 1827 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.