Search  
Friday, February 10, 2012 ..:: Forum ::.. Register  Login
 Forum Minimize
Pentru a putea posta mesaje trebuie să vă înregistraţi.
Notă: Mesajele cu conţinut jignitor sau ilegal (inclusiv cereri de soft piratat) nu sunt acceptate şi vor fi şterse imediat .

Pentru a primi raspunsuri rapide si corecte, scrieti in mesaj ce intentionati sa faceti, ce mesaj de eroare primiti, in ce context si in urma caror actiuni. De asemenea, mentionati versiunea de FoxPro in care lucrati!
Dacă nu specificați versiunea, se consideră VFP 9.0 SP2.

SearchForum Home
  Visual FoxPro  Visual FoxPro in general  transformare fi...
 transformare fisier txt - dbf
 
 2/3/2010 5:13:25 PM
User is offlinegillmifus
53 posts


transformare fisier txt - dbf
 (N/A)
Am o mica problema, vreau sa transform un fisier .txt in care sparatorul este ',' ex: fisierul .txt de la export din programul de bilant acel celbru pdf inteligent.
Vreau sa fac ceva manevre cu datele salvate si ma descurc cu un dbf nu stiu cum sa fac cu lungimea este variabila si delimitata de ','.
Multumesc anticipat. Gill
 2/3/2010 5:50:30 PM
User is offlineaflorin
838 posts
1st


Re: transformare fisier txt - dbf
 (N/A) Modified By aflorin  on 2/3/2010 5:51:29 PM)
Solutii:
1. Te uiti in help la APPEND FROM ... TYPE
2. creezi propriul programel de import, lucrind cu functiile low-level: FOPEN(), FREAD(), FCLOSE()

Florin Aparaschivei - Iasi
 2/3/2010 5:52:27 PM
User is offlineDaniel Buduru
2141 posts
1st




Re: transformare fisier txt - dbf
 (N/A)
Daca nu stii ce structura are fisierul (delimitarea cu ',' denota un fisisre csv (comma separated values), ai doua posibilitati:

1 Folosesti wizardul de import din VPP
Din menu-ul File, Import, se deschide fereastra de import, pe ea e un buton mare  in dreapta jos, "Import Wizard".

2. Deschizi fisierul in Excel sau in SciCalc (daca ai OpenOffice), apoi il salvezi dbf.



Daniel Buduru
 2/9/2010 3:36:42 PM
User is offlinegillmifus
53 posts


Re: transformare fisier txt - dbf
 (N/A)
A iesit perfect din wizard, as vrea ca pasii saii pun intr-o procedura sa nu stau pt fiecare fisier.
 2/9/2010 4:20:46 PM
User is offlineDaniel Buduru
2141 posts
1st




Re: transformare fisier txt - dbf
 (N/A) Modified By Daniel Buduru  on 2/9/2010 4:21:01 PM)
Daca structura fisierului se mentine, se poate crea un fisier cu acceasi structura apoi
APPEND FROM fisier.txt DELIMITED WITH ','


Daniel Buduru
 2/11/2010 9:22:39 PM
User is offlinegillmifus
53 posts


Re: transformare fisier txt - dbf
 (N/A)
Trebuie sa trec prin wizard ca structura cimpurilor este variabila. am acelasi nr de cimpuri dar de lungime variabila delimitate de un separator ',' . merge fb din wizard dar trebuie sa simulez intr-un programel ca sa nu pierd timp. Nu m-am descurcat la sinteza lui appe. trebuie sa mai exersez. am mai facut appe sdf nume.txt dar cimpurile nu erau variabile. gill
 2/11/2010 9:35:21 PM
User is offlinegillmifus
53 posts


Re: transformare fisier txt - dbf
 (N/A)
Sintaxa e ok. am problema ca fisierul are cimpuri cu lunigimi variabile. a mers perfect cu wizard , dar nu stiu sa il simulez . pls help. danke. gill
 2/12/2010 12:41:06 AM
User is offlineDaniel Buduru
2141 posts
1st




Re: transformare fisier txt - dbf
 (N/A) Modified By Daniel Buduru  on 2/12/2010 12:42:03 AM)

Lungimea variabila a campurilor nu este o problema daca exista un separator.
Cu wizard-ul ai stabilit nu numai marimea, ci si tipul campurilor.
Ia structura pe care ai  creat-o cu wizard-ul si mareste acoperitor dimensiunea campurilor caracter si numerice.
Poti merge pana la dimensiunea maxima de 254 pentru campul de tip caracter si double pentru campurile numerice.
Faci importul cu APPEND FROM ... DELIMITED WITH ','
Daca vrei sa ajustezi lungimea campurilor caracter dupa import poti folosi aceast cod:

Lparameters tcAlias  &&aliasul tabelei sau cursorului in care ai facut importul
If !Used(tcAlias)
  
Return
Endif
Local
lcSQL, laStruct[1], laLen[1], lnFields, lnI
lnFields=
Afields(laStruct,tcAlias)
Set Textmerge To Memvar lcSQL Noshow
Set Textmerge On
\Select
For
lnI=1 To lnFields
   If laStruct(lnI,2)='C'
     \\
MAX(LEN(TRIM(<<laStruct(lni,1)>>)))
  
Else
     
\\ MAX(LEN(<<laStruct(lni,1)>>))
  
Endif
   If lnI<lnFields
      \\ ,
  
Endif
Next
\\ FROM <<tcAlias>> INTO ARRAY laLen
Set Textmerge Off
Set Textmerge To

&lcSQL

Set Textmerge To Memvar lcSQL Noshow
Set Textmerge On
\Select
For
lnI=1 To lnFields
  
If laStruct(lnI,2)='C'
      \\
CAST(<<laStruct(lni,1)>> AS C(<<laLen(lni)>>)) as <<lastruct(lni,1)>>
   
Else
      
\\ <<laStruct(lni,1)>>
    Endif
    If
lnI<lnFields
       \\ ,
   
Endif
Next
\\ FROM <<tcAlias>> INTO cursor crsImport
Set Textmerge Off
Set Textmerge To
&lcSQL

*!*BROWSE


Daniel Buduru
 2/17/2010 10:18:22 PM
User is offlinegillmifus
53 posts


Re: transformare fisier txt - dbf
 (N/A) Modified By gillmifus  on 2/17/2010 11:07:01 PM)
Am gasit structura maxima a dbf-ului. Fac appe cum ai spus, dar desi am separator',' in momentul cind am sirul din txt cam asa: "04,35,,,04,,4711,3203085,XXX SRL,C,,,,,,", adica consecutiv 2,3 separatoare ramane in ceata... Am dat replace pe fisierul txt si am inlocuit ,, cu ,0,. Am rezolvat. Multumesc frumos de ajutor. Daca mai ai sugestii sunt deschis, ca vreau sa optimizez la maxim. Gill
 2/17/2010 10:30:37 PM
User is offlineDaniel Buduru
2141 posts
1st




Re: transformare fisier txt - dbf
 (N/A)
Nu "ramane in ceata" daca sunt mai multe separatoare consecutiv. Inseamna ca sunt campuri necompletate, si le trateaza ca atare
Problema poate fi alta:

- numarul de campuri nu este acelas in toate fisierele text;
- sunt campuri care contin virgula, cum ar fi un camp numeric cu virgula in loc de punct zecimal sau cu virgule ca separator de mii;

Ultima situatie poate fi delicata, poate fi alterat continutul campurilor.
Fa o  verificare vizuala pe un astfel de caz, si compara cu datele sursa, daca ai posibilitatea.


Daniel Buduru
 2/17/2010 11:11:23 PM
User is offlinegillmifus
53 posts


Re: transformare fisier txt - dbf
 (N/A)
Asa este, sunt cimpuri numerice necompletate. am un pic de noroc ca nu am zecimale, sunt numere intregi.
Am o problema mai mare, cind fac appe trebuie sa fac intr-un fisier care are mai multe cimpuri ... peste 256.
Trebuie sa sparg fisierul .txt in 2 ?
Nu mai vad solutia...
Problema nu este ca il sparg in 2, trebuie sa numar locatia pina unde si de unde incep, si deja devine iar complicat.
 2/17/2010 11:33:04 PM
User is offlinegillmifus
53 posts


Re: transformare fisier txt - dbf
 (N/A)
Ai scris comenzile de mai jos (adaptate de mine):
lctext=filetostr('unitate.txt')
lctext=chrtran(lctext,',,',',0,')
STRTOFILE(lcText,'unitate.txt',0)
Nu reusesc sa fac replace...
 2/17/2010 11:33:19 PM
User is offlineDaniel Buduru
2141 posts
1st




Re: transformare fisier txt - dbf
 (N/A)
Poti procesa fisierul text in cod.

lcText=Filetostr('fisiertext.extensie')
lnLines=ALINES(laLines, lcText)
lcSeparator=','
lnColumns=OCCURS(lcSeparator,laLines[1,1])
lntables=CEILING(lnColumns/254)

In vectorul laLines vei avea pe fiecare linie cate o linie din fisierul text.
lnColumns iti spune cate campuri are fisierul.
Acum, in functie de ce campuri iti trebuie,  fie le alegi pe cele necesare si le importi, fie desparti fisierul in tabele.
Pentru asta, extragi din fiecare linie a vectorului laLines subsirul necesar :

lcStr=SUBS(laLines(lni), at(',',laLines(lni),x)+1, at(',',laLines(lni),x+y)-at(',',laLines(lni),x))

Codul nu e testat, poate avea erori de tastare


Daniel Buduru
 2/17/2010 11:39:39 PM
User is offlineDaniel Buduru
2141 posts
1st




Re: transformare fisier txt - dbf
 (N/A)
 gillmifus wrote
Ai scris comenzile de mai jos (adaptate de mine):
lctext=filetostr('unitate.txt')
lctext=chrtran(lctext,',,',',0,')
STRTOFILE(lcText,'unitate.txt',0)
Nu reusesc sa fac replace...


CHRTRAN inlocuieste caracter cu caracter - vezi in help
STRTRAN inlocuieste un sir cu altul

lctext=STRTRAN(lcText,',,',',0,')

Totusi nu te sfatuiesc sa procedezi asa.



Daniel Buduru
 2/17/2010 11:48:43 PM
User is offlinegillmifus
53 posts


Re: transformare fisier txt - dbf
 (N/A)
Multumesc mult, am ignorat '+' dintre chr().
Poate solutia nu este ortodoxa, dar am rezolvat prima problema.
Sa verific si importul cu .txt lung >256 cimpuri

multumesc. gill
 2/18/2010 12:12:24 AM
User is offlinegillmifus
53 posts


Re: transformare fisier txt - dbf
 (N/A) Modified By gillmifus  on 2/18/2010 12:16:54 AM)
Am structura cimpurilor fixa=551. Pot renunta la ultimele 48 care sunt mereu =0, si atunci raman cu 2 fisiere, primul 255 si restul de 248. Calculeaza bine, problema este ca am ramas in ceata la ultima instructiune :
lcStr=SUBS(laLines(lni), at(',',laLines(lni),x)+1, at(',',laLines(lni),x+y)-at(',',laLines(lni),x))

lni, x, y
Deci fisierul meu 'date.txt' trebuie transformat in 'date1.txt' cu 255 de cimpuri separator ',' si restul.
 2/18/2010 12:25:44 AM
User is offlinegillmifus
53 posts


Re: transformare fisier txt - dbf
 (N/A) Modified By gillmifus  on 2/18/2010 12:59:46 AM)
Mai am de rezolvat o problema: am un contract care are 1 pagina in care trebuie sa inlocuiesc doar beneficiarul cu toate datele, pe care le am intr-un fisier .dbf.
Nu stiu cum sa abordez problema...
Sa incerc sa scriu totul intr-un raport sau intr-un .dbf ?
Bine, si ideal sa pot sa il export in format .doc sau .pdf. (sau si una si alta...)
Cred ca merge fb ca in helpul lui "SET TEXTMERGE TO ,SET TEXTMERGE ON"...
 2/18/2010 12:27:41 AM
User is offlineDaniel Buduru
2141 posts
1st




Re: transformare fisier txt - dbf
 (N/A)
lnI = linia curenta
x= primul separator
y= numar de campuri


lcText=Filetostr('fisiertext.extensie')
lnLines=ALINES(laLines, lcText)
lcSeparator=','
lnColumns=OCCURS(lcSeparator,laLines[1,1])
lntables=CEILING(lnColumns/254)
FOR lnk=1 to lnTables
SET TEXTMERGE TO MEMVAR lcStr
SET TEXTMERGE ON
FOR lni=1 to lnLines
lcLine=','+laLines(lni)
\\<<SUBS(lcLine, AT(lcSeparator,lcLine,(lnk-1)*lnTables)+1, AT(lcSeparator,lcLine,(lnk-1)*lnTables+254-AT(lcSeparator,lcLine,(lnk-1)*lnTables)-2)>>
NEXT lni
SET TEXTMERGE OFF
SET TEXTMERGE TO
STRTOFILE(lcStr,forceext('fistext'+tran(lnk),'txt'))
NEXT lnk

Netestat

Vei obtine cate un fisier text pentru fiecare grup de 254 de campuri

Daniel Buduru
 2/18/2010 12:29:46 AM
User is offlinegillmifus
53 posts


Re: transformare fisier txt - dbf
 (N/A)
Am abuzat de bunavointa ta. Multumesc mult de tot. Incerc sa mai rezist sa termin de scris coduletul.
multumesc. gill
 2/18/2010 12:39:44 AM
User is offlinegillmifus
53 posts


Re: transformare fisier txt - dbf
 (N/A)
Imi da o eroare lipsa ')', am incercat sa o strecor dar imi da "function argument value, type or count is invalid...
 2/18/2010 1:01:47 AM
User is offlineDaniel Buduru
2141 posts
1st




Re: transformare fisier txt - dbf
 (N/A) Modified By Daniel Buduru  on 2/18/2010 1:02:31 AM)
Era si o greseala de algoritm ...

cText=Filetostr('fisiertext.extensie')
lnLines=ALINES(laLines, lcText)
lcSeparator=','
lnColumns=OCCURS(lcSeparator,laLines[1,1])
lnFields=254
lntables=CEILING(lnColumns/lnFields)

FOR lnk=1 to lnTables
SET TEXTMERGE TO MEMVAR lcStr
SET TEXTMERGE ON
FOR lni=1 to lnLines
lcLine=','+laLines(lni)
\\<<SUBSTR(lcLine, AT(lcseparator,lcLine,(lnk-1)*lnfields+1), AT(lcseparator,lcLine,lnk*lnfields)-AT(lcseparator,lcLine,(lnk-1)*lnfields+1)-1)>>
NEXT lni
SET TEXTMERGE OFF

SET TEXTMERGE TO
STRTOFILE(lcStr,forceext('fistext'+tran(lnk),'txt'))
NEXT lnk


Daniel Buduru
 2/18/2010 1:04:45 AM
User is offlineDaniel Buduru
2141 posts
1st




Re: transformare fisier txt - dbf
 (N/A)
 gillmifus wrote
Mai am de rezolvat o problema: am un contract care are 1 pagina in care trebuie sa inlocuiesc doar beneficiarul cu toate datele, pe care le am intr-un fisier .dbf.
Nu stiu cum sa abordez problema...
Sa incerc sa scriu totul intr-un raport sau intr-un .dbf ?
Bine, si ideal sa pot sa il export in format .doc sau .pdf. (sau si una si alta...)
Cred ca merge fb ca in helpul lui "SET TEXTMERGE TO ,SET TEXTMERGE ON"...


Vezi si functia TEXTMETGE()


Daniel Buduru
 2/18/2010 1:16:34 AM
User is offlinegillmifus
53 posts


Re: transformare fisier txt - dbf
 (N/A)
A iesit ok.
multumesc frumos. O seara buna.
Gill
  Visual FoxPro  Visual FoxPro in general  transformare fi...

Search  Forum Home         

 Google Ads Minimize

    

Copyright 2002-2010 Profox   Terms Of Use  Privacy Statement