Página 1 de 1
Generar Archivo de texto y separar campos con TAB
Enviado: 12 Mai 2013 20:00
por victorale07
Hola:
Necesito generar un archivo de texto y que los campos sean separados por Tabulación TAB.-
Les agradesco.
Generar Archivo de texto y separar campos con TAB
Enviado: 13 Mai 2013 10:11
por Jairo Maia
Olá Victor,
De uma forma simples (porque você pode escolher campos, condição e etc também com esse comando) você pode fazer assim:
Código: Selecionar todos
Use Sua Tabela New
// Set Order TO nOrder // para uso de algum indice
COPY TO Seu_Arquivo.txt DELIMITED WITH TAB
Generar Archivo de texto y separar campos con TAB
Enviado: 13 Mai 2013 14:47
por alxsts
Olá!
Duas coisas:
1- Não sei se o exemplo do Jairo funcionaria com a palavra "TAB", da forma como foi escrito. Pelo que me consta, esta palavra não é reservada. Funcionaria se fosse declarada uma constante com o nome "TAB"
Código: Selecionar todos
#define TAB Chr(9)
Use Sua Tabela New
// Set Order TO nOrder // para uso de algum indice
COPY TO Seu_Arquivo.txt DELIMITED WITH TAB
2 - Mesmo funcionando, apenas os campos tipo carácter seriam colocados entre TABs. O separador de campos continuaria a ser a vírgula.
Creio que ele terá que desenvolver uma rotina customizada para conseguir o que quer...
Generar Archivo de texto y separar campos con TAB
Enviado: 15 Mai 2013 13:39
por Jairo Maia
Olá Pessoal,
Alexandre, apenas para registro: compilei aqui com o Clipper puro (usando o cl.bat do Clipper), e obtive o seguinte resultado:
1 - compilando o exemplo na forma que passei, não dá erro, mas não assume o TAB ( chr(9) ) como delimitador, aparecem as vírgulas. O único resultado que funcionou foi trocando o TAB por BLANK, ai sim é exportado limpo.
2 - compilando seu exemplo da mesma forma, o resultado também foi o mesmo.
Creio que a solução será mesmo ele montar uma rotina específica para isso.
NOTA: Apesar do assunto aqui ser Clipper, apenas para informe, no Harbour funciona 100% as opções: TAB PIPE e BLANK, além claro dos limitadores especificados entre aspas conforme conhecemos no Clipper.
Generar Archivo de texto y separar campos con TAB
Enviado: 15 Mai 2013 20:22
por victorale07
Hola:
Les agradesco por responderme.
Lo que necesito es en cada campo separarlos por tabulaciones, hice una prueba de esta manera:
set printer to ejemplo.txt
set print on
? 'campo1' + chr(9)+ 'campo2'+ chr(9)+'campo3'
? 'campo1' + chr(9)+ 'campo2'+ chr(9)+'campo3'
? 'campo1' + chr(9)+ 'campo2'+ chr(9)+'campo3'
set printer to
set print off
return(.t.)
pareciera que esta bien, no se si habra otra manera o alguna funcion.-
Gracias.
Generar Archivo de texto y separar campos con TAB
Enviado: 16 Mai 2013 13:55
por alxsts
Olá!
Você pode tentar o código abaixo (não testei):
Código: Selecionar todos
#include "Fileio.ch"
#define S_FLD_SEP Chr(9)
#define S_REC_SEP Chr(13) + Chr(10)
PROCEDURE SaveAsTabDelimited( cFile
LOCAL nHandle
LOCAL cFile
LOCAL cMsg
cFile := IF( cFile == NIL, "C:\Teste.Dbf", cFile )
BEGIN SEQUENCE
USE (cFile) EXCLUSIVE NEW ALIAS Teste
IF NetErr()
BREAK( "Problema ao abrir arquivo de Entrada.;Erro " + LTrim( Str( FERROR() ) ) )
ENDIF
IF (nHandle := FCREATE("Test.Txt", FC_NORMAL)) == -1
BREAK( "Problema ao criar arquivo de saída.;Erro " + LTrim( Str( FERROR() ) ) )
ENDIF
Teste->( DbGoTop(), ;
DbEval( {|| FWrite( nHandle, RecordAsString() + S_REC_SE ) } );
)
RECOVER USING cMsg
Alert( cMsg )
END SEQUENCE
IF nHandle > 0
FClose( nHandle )
ENDIF
Teste->( DbClosearea() )
RETURN
//------------------------------------------------------------------------------
FUNCTION RecordAsString()
LOCAL cString
LOCAL nFCount
LOCAL cValtype
LOCAL xVal
nFCount := FCount()
cString := ""
FOR nPos := 1 TO nFCount
cValType := ValType( ( xVal := FieldGet( nPos ) ) )
DO CASE
CASE cValType == "C" .Or. cValType == "M"
cString += '"' + xVal + '"'
CASE cValType == "N"
cString += LTrim( Str(xVal) )
CASE cValType == "D"
cString += '"' + DtoS(xVal) + '"'
CASE cValType == "L"
cString += '"' + IF( xVal, "T", "F" ) + '"'
END CASE
cString += S_FLD_SEP
NEXT
RETURN cString
//------------------------------------------------------------------------------
Edit: ajustes no código.
Generar Archivo de texto y separar campos con TAB
Enviado: 17 Mai 2013 16:35
por victorale07
Hola:
Gracias alxsts, por la rutina.
Voy a probarla en mi sistema.
atentamente.
Generar Archivo de texto y separar campos con TAB
Enviado: 17 Mai 2013 17:49
por alxsts
Olá!
Não te esqueça que se você gerar um arquivo neste formato, o sistema que vai lê-lo terá que reconhecer este formato. Não conheço nada que faça isto. Portanto, provavelmente será necessário criar outra rotina para fazer a leitura do mesmo.
É realmente necessário criar este arquivo com campos separados por TABs?
Generar Archivo de texto y separar campos con TAB
Enviado: 18 Mai 2013 20:31
por victorale07
Hola alxsts
Si, es necesario ya que la informacion hay que exportarla a otro software, el cual lo valida de esa manera.-
lo voy a probar.
Muchas gracias.
Generar Archivo de texto y separar campos con TAB
Enviado: 18 Mai 2013 23:36
por alxsts
Olá!
Victor: na rotina que escrevi, os campos estão separados por TAB e os campos char, date e logical estão entre aspas duplas. Os campos numéricos não estão delimitados por aspas. Exemplo: ( "ejemplo"TAB"20130518"TAB123TAB"F"TABCRLF).
Verifique como o software que vai ler este arquivo diferencia os campos char, date, numeric e logical. Se for de forma diferente da que está no exemplo, creio que não será difícil modificar o exemplo.
Generar Archivo de texto y separar campos con TAB
Enviado: 20 Mai 2013 19:16
por victorale07
Hola alxsts:
El software dice textualmente lo siguiente:
( La captura se hace a travez de un archivo de texto, con columnas y campos separados por tabulaciones.
Este archivo se puede preparar en Excel, grabando en formato "texto separado por tabulaciones". Se asume que el
primer registro contiene nombres de campos. )
Pero la idea es poder emitir este archivo de texto desde el programa hecho en clipper 5.2e.-
Creo que me puede servir lo que me enviastes, pero tengo que testearlo enviando el archivo ya creado al cliente que me lo ha pedido.
Gracias.
Generar Archivo de texto y separar campos con TAB
Enviado: 20 Mai 2013 20:45
por alxsts
Olá!
Victor:
fiz algumas alterações na rotina, baseadas nas últimas informações que você postou. Testei e abri o arquivo de saída com Excel 2010. Funcionou.
Espero que atenda a tua necessidade.
Código: Selecionar todos
//------------------------------------------------------------------------------
//
// Função : SaveAsTabDelimited - Lê um arquivo .DBF e exporta para arquivo
// texto com os campos separados por tabulações
// (Compatível com MS-Excel)
// Autor : Alexandre Santos - 20/05/2013
//
//------------------------------------------------------------------------------
#include "Set.ch"
#include "Fileio.ch"
#define S_FLD_SEP Chr(9)
#define S_REC_SEP Chr(13) + Chr(10)
PROCEDURE SaveAsTabDelimited( cFile )
LOCAL nHandle
LOCAL cMsg
LOCAL cSaveDate := Set( _SET_DATEFORMAT, "dd/mm/yyyy" )
SetMode( 25,80 )
// ALTD()
BEGIN SEQUENCE
IF Empty( cFile )
BREAK( "Problema ao abrir arquivo de Entrada.;Erro " + LTrim( Str( FERROR() ) ) )
ENDIF
USE (cFile) EXCLUSIVE NEW ALIAS Teste
IF NetErr()
BREAK( "Problema ao abrir arquivo de Entrada.;Erro " + LTrim( Str( FERROR() ) ) )
ENDIF
IF (nHandle := FCREATE("Test.Txt", FC_NORMAL)) == -1
BREAK( "Problema ao criar arquivo de saída.;Erro " + LTrim( Str( FERROR() ) ) )
ENDIF
Teste->( DbGoTop(), ;
FWrite( nHandle, RecordAsString( .T. ) + S_REC_SEP ), ; // Grava cabeçalho do Txt com nomes das colunas
DbEval( {|| FWrite( nHandle, RecordAsString() + S_REC_SEP ) } ), ; // grava os registros
Teste->( DbClosearea() ) ;
)
RECOVER USING cMsg
Alert( cMsg )
END SEQUENCE
IF nHandle > 0
FClose( nHandle )
ENDIF
// Restaura formato de data anterior
Set( _SET_DATEFORMAT, cSaveDate )
RETURN
//------------------------------------------------------------------------------
FUNCTION RecordAsString( lHeader )
LOCAL cString
LOCAL nFCount
LOCAL cValtype
LOCAL xVal
lHeader := IF( lHeader == NIL, .F., lHeader )
nFCount := FCount()
cString := ""
FOR nPos := 1 TO nFCount
IF ! lHeader
// Adiciona conteúdo dos campos
cValType := ValType( ( xVal := FieldGet( nPos ) ) )
DO CASE
CASE cValType == "C" .Or. cValType == "M"
cString += RTrim( xVal )
CASE cValType == "N"
cString += LTrim( Str(xVal) )
CASE cValType == "D"
cString += DtoC(xVal)
CASE cValType == "L"
cString += IF( xVal, "Sim,", "Não" )
END CASE
ELSE
// Adiciona nome do campo
cString += FieldName( nPos )
ENDIF
// Adiciona separador de campo (TAB), exceto para o último campo
IF nPos != nFCount
cString += S_FLD_SEP
ENDIF
NEXT
RETURN cString
//------------------------------------------------------------------------------