FoxPro/Visual FoxPro - Copiando tabla a CSV, perfecto, ...pero..

   
Vista:

Copiando tabla a CSV, perfecto, ...pero..

Publicado por DEVILSITO (311 intervenciones) el 17/07/2013 03:37:59
La instruccion: COPY TO archicsv TYPE CSV me genera un CSV cuyos campos estan encerrados por " (comilla doble) y a su vez estan separados por , (coma simple). Ademas como primera linea copia los nombres de los campos de la tabla.
Mis preguntas son:
-como cambiar la separacion de campos a punto y coma (;)
-como evitar que la primera linea no sea la de los nombres de los campos.

Desde ya, gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Copiando tabla a CSV, perfecto, ...pero..

Publicado por Fidel (558 intervenciones) el 17/07/2013 17:19:52
Tal vez te ayude usar bajo nivel. La rutina siguiente es un poco mas tediosa que COPY TO, pero puede ayudar.

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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
* Ejemplo de uso.
* Llamado
* Genera un cursor y llama a GenFileText()
*******************************************
SELECT nombre,idclien,cuit,calle,numero,cpostal,ciudad,provincia ;
	FROM clientes ;
	WHERE !EMPTY(cuit) AND VAL(idclien)#0 ;
	INTO CURSOR trclien
 
* Tipo: Cvs simil Excel
 
cFile="trclien<shut>"
cNomFiletext=ADDBS(dtemp)+"TxtClientes"
lHeader=.f.
lNotQuotes=.T.
cSymbol=";"
nFlag=0
GENFILETEXT(cFile,cNomFileText,cSymbol,lHeader,lNotQuotes,nFlag)
 
**********************************************************************************
PROCEDURE GENFILETEXT(xcFile,xcNomFileText,xcSymbol,xlHeader,xlNotQuotes,xnFlag)
**********************************************************************************
* Genera un archivo de texto plano, de tipo delimitado por Bajo Nivel
* xcFile: Tabla o cursor. Puede enviarse p.ej: cFile="MiCursor<shut>"
*         Con lo cual se cierra la tabla o cursor al terminar el proceso.
*         Tipicamente se genera un cursor ad-hoc para despachar los datos.
* xcNomFileText: Path\Nombre.ext del archivo de texto saliente.
*                La extensión por defecto será ".txt". Si desea otra extensión
*                incluya el nombre con la extensión requerida
*                Ej: xcNomfileText="\\MqCentral\TextOuput\miarchivoplano.ths"
* xcSymbol: Separador de campos: [,] [;] [|] [*] etc. (Default [,] )
* xlHeader: Si incluye el nombre de los campos en la primer fila
* xlNotQuotes: Por defecto, los campos caracter son encomillados (Delimited)
*              Si xlNotQuotes=.t., no tendrán comillas (SDF)
* xnFlag (manejado por FputLine() )
* 0 - Con Retorno de Carro, no incluye último separador
* 1 - Con Retorno de Carro, incluir útlimo separador
* 2 - Sin Retorno de Carro, no inlcuye último separador
* 3 - Sin REtorno de Carro, incluir último separador
******************************************************************************
* Funciones de usuario Utilizadas por GenFileTExt
* FPutLine()
* Qualifer()
* TelDecim() (convocada por Qualifer)
******************************************************************************
LOCAL nfop,lcRow,i,lnCampos,lShut
IF EMPTY(xcFile)
	RETURN
ENDIF
xcfile=LOWER(xcFile)
IF AT("<shut>",xcfile)#0
	lshut=.t.
	xcFile=STRTRAN(xcFile,"<shut>","")
ENDIF
 
IF !USED(xcFile)
	RETURN
ENDIF
IF EMPTY(xcNomFileText)
	RETURN
ENDIF
xnFlag=EVL(xnFlag,0)
IF xnFlag>3
	xnFlag=0
ENDIF
 
xcNomfileText=ALLTRIM(xcNomfileText)
lcExt=JUSTEXT(xcNomFileText)
IF EMPTY(lcExt)
	xcNomFileText=xcNomFileText+".txt"
ENDIF
 
xcSymbol=EVL(xcSymbol,[,])
nfop=FCREATE(xcNomFileText)
IF nfop<0
	RETURN
ENDIF
 
SELECT (xcFile)
lnCampos=FCOUNT()
IF xlHeader
	lcRow=""
	FOR i=1 TO lnCampos
		lcRow=lcRow+Qualifer(FIELD(i),xcSymbol,xlNotQuotes)
	NEXT
	fputLine(nfop,lcRow,xnFlag,xcSymbol)
ENDIF
 
SCAN
	lcRow=""
	FOR i=1 TO lnCampos
		lcCampo=FIELD(i)
 
		lcRow=lcRow+Qualifer(EVALUATE(lcCampo),xcSymbol,xlNotQuotes)
	NEXT
	fputLine(nfop,lcRow,xnFlag,xcSymbol)
 
ENDSCAN
=FCLOSE(nfop)
IF lshut
	IF USED(xcfile)
		SELECT (xcFile)
		USE
	ENDIF
ENDIF
o = CREATEOBJECT("Shell.Application")
o.ShellExecute("write.exe", '&xcNomFileText', "", "open", 1)
ENDPROC
 
PROCEDURE fputLine(xnfop,xcRow,xnFlag,xcSymbol)
***********************************************
xcRow=ALLTRIM(xcRow)
xcSymbol=EVL(xcSymbol,",")
xnFlag=EVL(xnFlag,0)
IF MOD(xnFlag,2)=0
	IF RIGHT(xcRow,1)=xcSymbol
		xcRow=LEFT(xcRow,LEN(xcRow)-1)
	ENDIF
ELSE
	IF RIGHT(xcRow,1)#xcSymbol
		xcRow=xcRow+xcSymbol
	ENDIF
ENDIF
DO case
	CASE INLIST(xnFlag,0,1)
		=FPUTS(xnfop,xcRow)
	CASE INLIST(xnFlag,2,3)
		=FWRITE(xnfop,xcRow)
ENDCASE
ENDPROC
 
 
*****************************************
PROCEDURE TelDecim(xcnNUmero,xnPrecision)
*****************************************
* Determina la cantidad de decimales de un número.
* xnPrecision podría ser Entre 10 y 16
* 16 daría una precisión mayor pero válida para
* números con alta cantidad de decimales.
*********************************************
local i_,minumero,pnumero,cRest,nDecimales
if vartype(xnprecision)#"N"
	xnPrecision=10
endif
kevar=Vartype(xcnNumero)
do case
	case kevar="C"
		minumero=val(xcnNumero)
	case kevar$'NI'
		Minumero=xcnNumero
	other
		return 0
endcase
if minumero=0
	return 0
endif
nDecimales=16
for i_=0 to 16
	pNumero=Round(MiNumero*10**i_,xnPrecision)
	cRest=pNumero-Int(pNumero)
	nDecimales=i_
	if Round(cRest,xnPrecision)=0
		exit
	endif
next
return nDecimales
ENDPROC
 
 
**********************************
PROCEDURE QUALIFER(xDato,xcSymbol,xlNotQuotes)
***********************************
* Calificador de datos simil Delimited
 
LOCAL lcQuot,lcClin,lcRemp,kvt,vret,qdezim
lcQuot=IIF(xlNotQuotes,[],["])
if vartype(xcSymbol)#"C".or.empty(xcSymbol)
	xcSymbol=","
endif

kvt=vartype(xDato)
vret=""
lcClin=CHR(9)+CHR(10)+CHR(13)
lcRemp=REPLICATE(SPACE(1),3)
do case
	case kvt="C"
		xDato=CHRTRAN(xDato,lcClin,lcRemp)
		vret=lcQuot+alltrim(strtran(xdato,xcSymbol))+lcQuot
	case kvt="N"
		qDezim=TelDecim(xDato)
		vret=ltrim(str(xDato,20,qDezim))
	
	case kvt="I"
		vret=ltrim(str(xdato))
	
	case kvt="D"
		vret=dtoc(xdato)
	case kvt="T"
		vret=ttoc(xdato)
	case kvt="L"
		vret=iif(xdato,".T.",".F.")
	other
	
endcase

return vret+xcSymbol
ENDPROC
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar