[ darko_sudarov @ 10.04.2007. 09:15 ] @
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]
[ savkic @ 10.04.2007. 09:41 ] @
> 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.
[ X Files @ 10.04.2007. 09:51 ] @
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.

[ darko_sudarov @ 10.04.2007. 13:06 ] @
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?
[ savkic @ 10.04.2007. 13:34 ] @
> 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));
   ...



[ X Files @ 10.04.2007. 15:29 ] @
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 ...
   }
}


[ darko_sudarov @ 11.04.2007. 08:04 ] @
Probano i radi!!!!
HVALA NA POMOCI :-)))))