Cancellazione su file di testo



  • Sempre su intervento su file t
    di Enzo (utente non iscritto) data: 05/06/2009

    Ciao ragazzi ho voluto aprire un altra discussione e vi spiego il mio quesito
    l'istruzione qui sotto funziona perfettamente in quanto apre un file di testo posto nella colonna a di excel
    analizza ogni singolo record e se questo inizia per 0 cancella la riga
    la mia domanda e' questa
    invece di cancellarla vorrei che questa sparisse ossia con l'istruzione attuale cancella il contenuto (so in partenza che ogni singolo record e' lungo 508)ma vorrei eliminarla
    esiste un altro comando al posto di replace o posso integrare con qualche vostra idea
    grazie per l'aiuto

     
    For I = 2 To 3
    direc = CurDir
    Open Range("a" & I) For Input As #1
    Open direc & "" & Range("K" & I) & ".txt" For Output As #2
    Do Until EOF(1)
    Line Input #1, DATA
    record = Mid(DATA, 1, 1)
    if record = 0 then
    tutto= Mid(DATA, 1, 508)
    DATA = Replace(DATA, tutto,"",,1)
    Debug.Print DATA
    Print #2, DATA
    Loop
    Close
    Kill Range("A" & I)
    Name direc & "" & Range("K" & I) & ".txt" As Range("A" & I)
    Next I
    
    



  • di Enzo (utente non iscritto) data: 05/06/2009

    Per "eliminarla intendo che non si vedano gli spazi vuoti
     
    prima
    888888888888888888888888888
    111111111111111111111111111
    000000000000000000000000000
    222222222222222222222222222
    
    con la mia istruzione 
    888888888888888888888888888
    111111111111111111111111111
    
    222222222222222222222222222
    
    
    quello che vorrei
    888888888888888888888888888
    111111111111111111111111111
    222222222222222222222222222



  • di Ricky53 data: 06/06/2009

    Ciao enzo,
    prova con questa modifica: in output vengono scritte le reghe solo se il primo carattere diverso da "0".

    ciao da ricky53
     
    For I = 2 To 3
        direc = CurDir
        Open Range("A" & I) For Input As #1
        Open direc & "" & Range("K" & I) & ".txt" For Output As #2
        Do Until EOF(1)
            Line Input #1, DATA
            If Mid(DATA, 1, 1) <> "0" Then
                Print #2, DATA
            End If
        Loop
        Close
        Kill Range("A" & I)
        Name direc & "" & Range("K" & I) & ".txt" As Range("A" & I)
    Next I
    



  • di Enzo (utente non iscritto) data: 06/06/2009

    Ciao ricky, devo riprendere una cosa che mi avevi detto tempo fa ossia
    .......spiega meglio quello che vuoi fare e forse avrai una risposta
    effettivamente come ti avevo descritto il problema la tua istruzione andrebbe benissimo ed io avevo fatto un semplice esempio per non andare nello specifico
    il problema e' che le righe che io devo cancellare o non scrivere nel nuovo file iniziano per zero ma non deovono avere un campo zero piu' avanti
    quindi non tutti i record che iniziano per zero devono essere cancellati
    mi spiego meglio:
    ogni record che inizia per zero ha nella posizione dalla 8 alla 12 dei numeri che possono essere anche tutti zeri
    sono questi che non devono essere scritti

    --------------------------------------
    questo si
    0000000001100000000
    questo no
    0000000000000000000



  • di Ricky53 data: 06/06/2009

    Ciao enzo,
    proprio così si deve sempre spiegare con chiarezza e tutto.
    lo cosa è semplice: le condizioni sono due quindi va modificata la:

    if mid(data, 1, 1) <> "0" then

    con

    if mid(data, 1, 1) <> "0" and ... la tua nuova condizione ... then

    provaci

    ciao da ricky53



  • di Enzo (utente non iscritto) data: 07/06/2009

    Ci provo e ti faccio sapere



  • di Ricky53 data: 09/06/2009

    Enzo:
    fattoooo!!! (come diceva fiorello rifacendo il verso a giovanni muciaccia)

    risoltooo!!!

    ciao da ricky53



  • di Enzo (utente non iscritto) data: 09/06/2009

    Si, scusa sono stato impegnato al lavoro
    ho risolto filtrando i dati in qul modo
    grazie di nuovo
    ciao e alla prossima
    p.s. se ti dovesse venire in mente (piu' che altro per altri lavori che ho in mente) come cancellare fisicamente un record se si verificano determinate condizioni fammelo sapere
    come ti ho detto precedentemente alla eliminazione dei dati ci sono dei dati ma mi lasciava la riga vuota.
    se hai una idea e' ben accetta





  • di Enzo (utente non iscritto) data: 09/06/2009

    Ho riletto quello che ho scritto e ' nella fretta sembra di essermi espresso in maniera poco chiara.
    volevo dire che ero arrivato alla cancellazione dei dati ma mi lasciava gli spazi vuoti
    se invecei hai una idea per cancellarla fisicamente e' ben accetta
    ciao



  • di Ricky53 data: 09/06/2009

    Ciao enzo,
    da quanto hai scritto prima e successivamente ricavo che non hai letto con attenzione
    quanto ti ho suggerito:
    la macro proposta non scrive (in output) il record che rientra nelle condizioni.
    dovevi solo aggiungere la nuova condizione:
    … ha nella posizione dalla 8 alla 12 dei numeri che possono essere anche tutti zeri ...

    va bene lo faccio però questa soluzione si chiama "chiavi in mano" o in modo popolare "pappa pronta" e non mi trovi favorevole perchè non si impara nulla in questo modo.

    prova.

    ciao da ricky53
     
    For I = 2 To 3
        direc = CurDir
        Open Range("A" & I) For Input As #1
        Open direc & "" & Range("K" & I) & ".txt" For Output As #2
        Do Until EOF(1)
            Line Input #1, DATA
            If Mid(DATA, 1, 1) <> "0" and Mid(DATA, 8, 5) <> "0" Then
                Print #2, DATA
            End If
        Loop
        Close
        Kill Range("A" & I)
        Name direc & "" & Range("K" & I) & ".txt" As Range("A" & I)
    Next I
    



  • di Enzo (utente non iscritto) data: 09/06/2009

    Ciao ricki forse non hai letto tu attentamente quello che ho scritto
    il problema l'ho risolto in quel modo pero' e' come aggirare l'ostacolo
    visto che nell'istruzione mia iniziale riesco ad individuare il record da cancellare e lo cancello ma lasciando degli spazi, ti avevo chiesto che se a tempo perso ti veniva un idea per cancellare fisicamente il record senza spazi me lo potevi comunicare



  • di Enzo (utente non iscritto) data: 09/06/2009

    P.s. non mi e' mai piaciuta la pappa pronta
    e per dimostrarti cio
    e' da tempo che ho questa istruzione che mi elimina fisicamente il record da un file ma si esegue solo quando quando trova esattamente "texttofind" ma lo ricerca genericamente
    devo cercare di adattarlo con degli if
    bye

     
     FPATH = "C:PROVA.TXT"
        TEXTTOFIND = "00000"
        Dim fHW As Integer
        Dim fHR As Integer
        Dim sf As String
        On Error Resume Next
        Kill FPATH & "_TMP"
        Err.Clear
        fHW = FreeFile
        Open FPATH & "_TMP" For Output As #fHW
        If Err = 0 Then
            fHR = FreeFile
            Open FPATH For Input As #fHR
            If Err = 0 Then
                Do While Not EOF(fHR)
                    Line Input #fHR, sf
                    Record = Mid(sf, 384, 20)
                                    If InStr(sf, TEXTTOFIND) = 0 Then
                        Print #fHW, sf
          End If
                Loop
                  End If
        End If
        Close #fHR
        Close #fHW
        Kill FPATH
        Name FPATH & "_TMP" As FPATH
    



  • di Ricky53 data: 09/06/2009

    Ciao enzo,
    la mia era solo una forma semi-spiritosa (che uso spesso) di scrivere, nulla di offensivo.
    ti conosco da tanto tempo per non sapere come operi.

    torniamo al pratico:
    io ho capito questo
    1. l'istruzione data = replace(data, tutto,"",,1)
    ti crea una riga vuota che vuoi eliminare
    2. con la macro che riporto tu non ottieni la scrittura in output (che chiami cancellazione) corretta
    3. questa istruzione non funziona come vorresti: if instr(sf, texttofind) = 0 then che corrisponde a
    scrivi se non trovi “00000” ma non gli dice da quale posizione è qui sta il problema
    4. la mia proposta
    if mid(data, 8, 5) <> "00000" then
    print #2, data
    end if
    scrive (in output) solo se non trova “00000” a partire dalla posizione 8 (gli dice la posizione).

    da qui in poi non ho capito se hai utilizzato la mia precedente istruzione (che comunque fa quello che chiedi) e non ti soddisfa.

    spero di aver chiarito tutto.

    ciao da ricky53

     
    'macro che usa enzo
    FPATH = "C:PROVA.TXT"
        TEXTTOFIND = "00000"
        Dim fHW As Integer
        Dim fHR As Integer
        Dim sf As String
        On Error Resume Next
        Kill FPATH & "_TMP"
        Err.Clear
        fHW = FreeFile
        Open FPATH & "_TMP" For Output As #fHW
        If Err = 0 Then
            fHR = FreeFile
            Open FPATH For Input As #fHR
            If Err = 0 Then
                Do While Not EOF(fHR)
                    Line Input #fHR, sf
                    Record = Mid(sf, 384, 20)
                                    If InStr(sf, TEXTTOFIND) = 0 Then
                        Print #fHW, sf
          End If
                Loop
                  End If
        End If
        Close #fHR
        Close #fHW
        Kill FPATH
        Name FPATH & "_TMP" As FPATH
    
    



  • di Ricky53 data: 09/06/2009

    Ciao enzo,
    prima non ho scritto che potevi sostituire, nella tua macro, l'istruzione:

    if instr(sf, texttofind) = 0 then

    con

    if mid(sf, 8, 5) <> "00000" then


    ci sono altre cose che non mi sono chiare nel tuo codice ma, non avendo l'intera macro, non posso darti nessun suggerimento altrimenti rischierei di fare danni invece di aiutarti ad ottimizzare il tuo codice.

    ciao da ricky53



  • di Enzo (utente non iscritto) data: 10/06/2009

    Ciao ricky, prima di tutto non mi sono offeso e quindi tutto ok
    la tua istruzione precedente funziona benissimo
    diciamo che questa "discussione" puo' essersi conclusa.
    la mia domanda era solamente posta per eventualmente risolvere la cancellazione fisica di un record da un file txt ma abbiamo risolto, anzni hai risolto in maniera brillante il quesito.
    ciao ed alla prossima




  • di Ricky53 (utente non iscritto) data: 10/06/2009

    Ciao enzo,
    benissimo.

    buon proseguimento ed alla prossima.

    ciao da ricky53