Generar Archivo de texto y separar campos con TAB

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

victorale07
Usuário Nível 2
Usuário Nível 2
Mensagens: 67
Registrado em: 20 Ago 2009 19:55
Localização: chile

Generar Archivo de texto y separar campos con TAB

Mensagem por victorale07 »

Hola:

Necesito generar un archivo de texto y que los campos sean separados por Tabulación TAB.-

Les agradesco.
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Generar Archivo de texto y separar campos con TAB

Mensagem 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
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Generar Archivo de texto y separar campos con TAB

Mensagem 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...
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Generar Archivo de texto y separar campos con TAB

Mensagem 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.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
victorale07
Usuário Nível 2
Usuário Nível 2
Mensagens: 67
Registrado em: 20 Ago 2009 19:55
Localização: chile

Generar Archivo de texto y separar campos con TAB

Mensagem 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.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Generar Archivo de texto y separar campos con TAB

Mensagem 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.
[]´s
Alexandre Santos (AlxSts)
victorale07
Usuário Nível 2
Usuário Nível 2
Mensagens: 67
Registrado em: 20 Ago 2009 19:55
Localização: chile

Generar Archivo de texto y separar campos con TAB

Mensagem por victorale07 »

Hola:
Gracias alxsts, por la rutina.
Voy a probarla en mi sistema.

atentamente.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Generar Archivo de texto y separar campos con TAB

Mensagem 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?
[]´s
Alexandre Santos (AlxSts)
victorale07
Usuário Nível 2
Usuário Nível 2
Mensagens: 67
Registrado em: 20 Ago 2009 19:55
Localização: chile

Generar Archivo de texto y separar campos con TAB

Mensagem 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.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Generar Archivo de texto y separar campos con TAB

Mensagem 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.
[]´s
Alexandre Santos (AlxSts)
victorale07
Usuário Nível 2
Usuário Nível 2
Mensagens: 67
Registrado em: 20 Ago 2009 19:55
Localização: chile

Generar Archivo de texto y separar campos con TAB

Mensagem 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.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Generar Archivo de texto y separar campos con TAB

Mensagem 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
//------------------------------------------------------------------------------
[]´s
Alexandre Santos (AlxSts)
Responder