Buscar String em Arquivos

Discussão em 'Arquivos e Impressoras' iniciado por fdantas, Fevereiro 19, 2009.

  1. fdantas

    fdantas Administrator Moderador

    Código:
    def var ruta as char format "x(30)" init ".".
    def var ficheros-a-buscar as char format "x(20)" init "*.p".
    def var fichero-de-salida as char format "x(30)" init "Resultado".
    
    def var lineas as char format "x(30)".
    
    def var comando-busqueda as char format "x(60)".
    
    def var fichero as char format "x(14)".
    DEF VAR Cadena AS CHAR FORMAT "X(100)".
    define stream lista.
    define stream FICHEROS.
    define stream salida.
    DEF VAR Cadena-a-Buscar AS CHAR FORMAT "X(50)".
    DEF VAR Cadena-a-Sustituir AS CHAR FORMAT "X(50)".
    
    DEF VAR NUM-FIC AS INT.
    DEF VAR NUM-LIN AS INT.
    DEF VAR VECES AS INT.
    
    SESSION:DATA-ENTRY-RETURN=TRUE.
    
    UPDATE Ruta Ficheros-a-Buscar Cadena-a-Buscar fichero-de-salida
    with side-labels.
    
    comando-busqueda = "dir " + ruta + "\" + ficheros-a-buscar + "/B >" + "Programa".
    OS-COMMAND silent VALUE(comando-busqueda).
    
    OUTPUT STREAM Salida TO value(fichero-de-salida).
    PUT STREAM Salida "Cadena a Buscar = " Cadena-a-Buscar SKIP(2).
    PUT STREAM Salida
    "Fichero" FORMAT "X(31)"
    "N. VECES" FORMAT "X(9)"
    "SUMA LINEAS" FORMAT "X(12)"
    "LINEAS ENCONTRADAS"
    skip.
    PUT STREAM Salida
    fill("-",30) FORMAT "X(30)" SPACE(1)
    fill("-",30) FORMAT "X(30)" SPACE(1)
    fill("-",11) FORMAT "X(11)" SPACE(1)
    fill("-",30) FORMAT "X(31)"
    skip.
    /* PUT STREAM Salida
    fill("=",30) FORMAT "X(30)" SPACE(1)
    fill("=",30) FORMAT "X(30)" SPACE(1)
    fill("=",11) FORMAT "X(11)" SPACE(1)
    fill("=",30) FORMAT "X(31)"
    skip. */
    
    INPUT STREAM LISTA FROM PROGRAMA.
    REPEAT:
    IMPORT STREAM LISTA UNFORMATTED fichero.
    IF SEARCH(Fichero) = ? THEN NEXT.
    
    NUM-LIN = 0.
    veces = 0.
    Lineas = "".
    NUM-FIC = NUM-FIC + 1.
    INPUT STREAM FICHEROS FROM VALUE(FICHERO).
    DISPLAY "Buscando en el fichero " fichero WITH FRAME PP NO-LABELS.
    pause 0.
    REPEAT:
    IMPORT STREAM FICHEROS UNFORMATTED CADENA.
    NUM-LIN = NUM-LIN + 1.
    IF INDEX(CADENA, Cadena-a-Buscar) > 0 THEN
    DO:
    veces = veces + 1.
    IF Lineas = "" THEN
    Lineas = STRING(NUM-LIN, ">,>>9").
    ELSE
    Lineas = Lineas + " - " + STRING(NUM-LIN, ">,>>9").
    END.
    END.
    IF Veces > 0 THEN
    PUT STREAM Salida fichero format "x(31)"
    STRING(veces, ">>>,>>9") FORMAT "X(9)"
    STRING(NUM-LIN, ">>>,>>9") FORMAT "X(12)"
    Lineas FORMAT "X(30)" SKIP.
    INPUT STREAM FICHEROS CLOSE.
    END.
    INPUT STREAM LISTA CLOSE.
    OUTPUT CLOSE.
    return.
    
    
    
    
  2. h2danilo

    h2danilo Sem Pontuação

    fdantas,

    Estou com o seguinte problema:
    Tenho um SmartWindow para buscar string, onde defino a Rota de Busca, tipos de Arquivos, string que desejo buscar. E esta então busca os aquivos. No entanto qdo digito na string de busca uma palavra com espaço (Ex: Contas a Pagar), ele busca apenas pelo "Contas" não considera o "a Pagar", se procurar por "contas-a-pagar" ai considera. Pode me ajudar com isso??

    Segue o Código:
    Botão "Pesquisar":
    ---------------------
    FOR EACH dir-1:
    DELETE dir-1.
    END.
    CLOSE QUERY BROWSE-2.
    RUN pro-diretorio.
    DEF VAR nu-xlinha AS INT.
    DEF VAR nu-xocorr AS INT.
    DEF VAR vc-xlinhas AS CHAR.
    DEF VAR no-xdiretorio AS CHAR.
    DEF VAR destino AS CHAR.

    FOR EACH tt-lista:
    DELETE tt-lista.
    END.

    FOR EACH dir-1 WHERE dir-1.vc-dir-1 <> '':
    ASSIGN no-xdiretorio = dir-1.vc-dir-1
    nu-xlinha = 0
    nu-xlinha = 0
    nu-xocorr = 0
    vc-xlinhas = "".

    nu-xregistro = nu-xregistro + 1.
    INPUT STREAM arquivos FROM VALUE(no-xdiretorio).
    vc-xmessage = "Buscando diretório " + no-xdiretorio.
    DISPLAY vc-xmessage WITH FRAME {&FRAME-NAME}.
    REPEAT:
    IMPORT STREAM arquivos UNFORMATTED CADENA.

    nu-xlinha = nu-xlinha + 1.
    IF INDEX(CADENA, vc-xstring) > 0 THEN DO:
    nu-xocorr = nu-xocorr + 1.
    IF vc-xlinhas = "" THEN
    vc-xlinhas = STRING(nu-xlinha, ">,>>9").
    ELSE
    vc-xlinhas = vc-xlinhas + " - " + STRING(nu-xlinha, ">,>>9").
    END.
    END.
    IF nu-xocorr > 0 THEN DO:
    CREATE tt-lista.
    tt-lista.no-arquivo = no-xdiretorio.
    tt-lista.nu-ocorr = nu-xocorr.
    tt-lista.nu-linha = nu-xlinha.
    tt-lista.vc-linhas = vc-xlinhas.
    {&OPEN-QUERY-{&BROWSE-NAME}}
    END.
    INPUT STREAM arquivos CLOSE.

    END.
    vc-xmessage = "Fim da Busca".
    DISPLAY vc-xmessage WITH FRAME {&FRAME-NAME}.
    END.
    END.

    Procedure Pro-diretorio
    ----------------------------
    proc-1 = SESSION:TEMP-DIRECTORY + "proc-1".

    ASSIGN vc-xcomandobusca = "dir " + vc-xrota + "\" + vc-xtp-arquivo + " /b /s > " + proc-1.

    OS-COMMAND SILENT VALUE(vc-xcomandobusca).

    INPUT FROM proc-1.
    REPEAT:
    CREATE dir-1.
    IMPORT dir-1.

    END.
    INPUT CLOSE.


    END PROCEDURE.

    Variaveis
    ---------------
    DEFINE VAR vi-xtampag AS INT .

    DEFINE VAR vc-xempresa AS CHAR.
    DEFINE VAR vc-xsistema AS CHAR.
    DEFINE VAR vc-xcontrato AS CHAR.
    DEFINE VAR vc-xperiodo AS CHAR.

    DEFINE VAR vc-xdata AS CHAR.
    DEFINE VAR vc-xlocal AS CHAR.
    DEFINE VAR vc-xtexto AS CHAR.
    DEFINE VAR vc-xsaida AS CHAR.
    DEFINE VAR vc-xcomando AS CHAR.
    DEFINE VAR vc-xpedida AS CHAR.
    DEFINE VAR proc-1 AS CHAR.
    DEFINE VAR proc-2 AS CHAR.

    DEFINE TEMP-TABLE dir-1
    FIELD vc-dir-1 AS CHAR.
    /*
    SESSION:DATA-ENTRY-RETURN=TRUE.
    DEF VAR estado AS LOG.
    DEF VAR Fila AS ROWID.
    ON 'F10':U GO.
    */
    DEFINE WORKFILE tt-lista
    FIELD no-arquivo AS CHAR
    FIELD nu-ocorr AS INT
    FIELD nu-linha AS INT
    FIELD vc-linhas AS CHAR.
    DEF VAR NL AS INT.
    DEF VAR vc-xcomandobusca as char format "x(60)".
    DEF VAR no-arquivo AS CHAR.
    DEF VAR Cadena AS CHAR.
    DEF VAR nu-xregistro AS INT.
    DEFINE STREAM arquivos.
    DEFINE STREAM LISTA.
  3. LFBuozi

    LFBuozi Membro Participativo

    os-command usa comandos, como do DOS, então no caso de espaços, ele apresenta erros.
    Indico usar o programa que o fdantas colocou ou arrume uma forma da string de busca ficar entre aspas, por exemplo:
    assign busca = "~"contas a pagar~"".

  4. h2danilo

    h2danilo Sem Pontuação

    Vlw amigo, deu certo aki...obrigado!!!

Compartilhe esta Página