Eliminare righe txt file

giovedì 25 ottobre 2007 - 18.20

almax Profilo | Junior Member

Ciao volevo un aiutino per capire come poter fare ad eliminare una riga o piu' righe da un file txt. Posto una parte del codice:

private pulisci()

Dim linesToRemove() As String
'questo è il file che carico con openfiledalog
Dim fi As String
fi = OpenFile.FileName
'qui leggo tutte le righe e le inserisco in un array
Dim lines() As String = IO.File.ReadAllLines(fi)

da qui in poi dovrei riuscire a eliminare quelle righe per riscrivere tutto pulito, il problema è

Using sw As New IO.StreamWriter(fi)
For Each line As String In lines

If Array.IndexOf(linesToRemove, line) = 1 Then (se qui metto -1 mi va in errore se metto 1 mi restituisce il file bianco)
sw.WriteLine(line)
End If
Next

End Using
end sub

Tutto questo perchè non conosco il numero delle righe da eliminare ma so che cosa deve avere scritto per essere eliminate
quindi avrei bisogno di questo per scorrere le righe e eliminare quelle che portano scritto determinate cose.
Grazie

StefanoLep Profilo | Senior Member

Ciao, ti allego un pò di codice che spero ti aiuti

Dim Elenco As New ArrayList() 'elenco delle parole da scartare Elenco.Add("Pippo") Elenco.Add("Pluto") Dim Riga As String Dim sr As StreamReader = File.OpenText("C:\_a.txt") Do While sr.Peek() >= 0 Riga = sr.ReadLine If Elenco.Contains(Riga) Then 'non faccio niente Else txt1.Text &= Riga & vbCrLf End If Loop sr.Close()

alla fine della lettura la tua txt1 conterra solo le righe che ti interessano e poi scrivere tutto in un file nuovo :-)





Solo chi fa sbaglia :-)

almax Profilo | Junior Member

Ti ringrazio della risposta ho provato il codice con qualche ritocco con esito negativo . Volevo chiederti questo sulla base del tuo codice .
Considera che il file di testo che devo pulire è generato non so da quale programma e avevo pensato questo:
vado a leggere n righe nel file, sistematicamente c'è un carattere e subito dopo 5 righe che devo saltare sempre .

pensavo
con un ciclo

se quello che leggo è uguale al carattere
incremento di 5
e leggo subito dopo .
leggo riga dal sorgente
scrivo riga sull'output

potrebbe andare ? avresti del codice da postarmi in questo senso ?
Grazie

StefanoLep Profilo | Senior Member

Potrebbe andare, tanto se le righe da scartare sono sempre 5 va benissimo...anche se la soluzione dell'array con i valori da escludere mi sembra più elegante...
Forse dovresti però dovresti cercare di capire quale parte di codice non funziona a dovere, cioè se non funziona la condizione perchè non trova mai corrispondenza, o se il problema è nell'elenco dei valori da scartare.

Solo chi fa sbaglia :-)

almax Profilo | Junior Member

Forse mi sono spiegato male .. Cioè il tuo scritto funziona benissimo pero'

ho fatto delle prove così
e non mi esclude tutta la riga ... Cioè il file che devo pulire non ha sempre scritta la stessa cosa quindi me le esclude una volte e basta, la certezza sta nelle righe che devo escludere sempre 5 da uno stesso punto di inizio ... Se no mi piaceva la tua soluzione.
Anche perchè l'avevo inplementata in maniera che fosse l'utente a caricare l'array per eliminare le righe , pero' in questo caso è sistematico da li + 5 devo non scrivere ...
Ora ti vorrei chiedere questo per implementare il contatore sul ciclo devo utilizzare una lettura e scrittura con for ?

StefanoLep Profilo | Senior Member

Io metterei una varibile X nel ciclo do che usi per leggere il file, il file lo leggo sempre tutto una riga alla volta, al verificarsi di una condizione valorizzo la variabile a 0, ogni ciclo successivo la aumento di 1


Do While sr.Peek() >= 0
Riga = sr.ReadLine
If CondizioneEsclusione = True Then
X += 1
if X = 4 Then
CondizioneEsclusione = False
X = 0
End If
Else
txt1.Text &= Riga & vbCrLf
End If
Loop

Solo chi fa sbaglia :-)

almax Profilo | Junior Member

Si è giusto pero' io così devo creare dei confronti riga per riga e mi creano dei problemi se pero' io prima conto tutte le righe del file
mettiamo 100 righe è un numero variabile .
e ciclo da x a 100

se trovo quel carattere
x+=5
leggo riga
scrivo riga

di modo che non devo confrontare riga per riga ma se si verifica la condizione vado a leggere direttamente 5 righe dopo tralasciando
le righe che devo saltare

Dim sr As New StreamReader(file)
Do While sr.Peek() >= 0
Riga = sr.ReadLine
num += 1
Loop

così ho il numero totale di righe
inizio la lettura da 0 a num
se incontro il carattere aggiungo 5 a x e scavalco la parte che devo tagliare

StefanoLep Profilo | Senior Member

Si ma come fai a dire Leggimi la riga X?

Solo chi fa sbaglia :-)

almax Profilo | Junior Member

Ho provato così ti posto del codice

'qui gli dò in pasto un file dove ci sono delle righe che devo togliere

Dim linesToRemove() As String = IO.File.ReadAllLines("c://prova.txt")

'questo è il file che carico con openfiledalog
Dim fi As String
fi = OpenFile.FileName
'qui leggo tutte le righe e le inserisco in un array
Dim lines() As String = IO.File.ReadAllLines(fi)
Using sw As New IO.StreamWriter(fi)
For Each line As String In lines
' qui gli dico se ci sono delle righe uguali non scriverle
If Array.IndexOf(linesToRemove, line) = -1 Then
'qui riscrivo su un file l'array line ...
sw.WriteLine(line)
txt1.Text &= line & vbCrLf

End If
Next

End Using

StefanoLep Profilo | Senior Member

L'importante è il risultato, in termini di tempo non credo che ci siano differenze rilevanti tra un modo e l'altro :-)
E poi il bello della programmazione è che ci sono tanti modi per avere lo stesso risultato :-)


Solo chi fa sbaglia :-)

almax Profilo | Junior Member

Ho provato così ti posto del codice

'qui gli dò in pasto un file dove ci sono delle righe che devo togliere

Dim linesToRemove() As String = IO.File.ReadAllLines("c://prova.txt")

'questo è il file che carico con openfiledalog
Dim fi As String
fi = OpenFile.FileName
'qui leggo tutte le righe e le inserisco in un array
Dim lines() As String = IO.File.ReadAllLines(fi)
Using sw As New IO.StreamWriter(fi)
For Each line As String In lines
' qui gli dico se ci sono delle righe uguali non scriverle
If Array.IndexOf(linesToRemove, line) = -1 Then
'qui riscrivo su un file l'array line ...
sw.WriteLine(line)
txt1.Text &= line & vbCrLf

End If
Next

End Using

StefanoLep Profilo | Senior Member

Mi sembra che alla fine hai realizzato una soluzione molto pulita, ciao alla prossima :-)

Solo chi fa sbaglia :-)

almax Profilo | Junior Member

Ti ringrazio per l'interessamento postero' il codice appena totalmente funzionante...

Mi sapresti dire perchè mi dà un errore di indice?

Dim fi As String
fi = OpenFile.FileName
'qui leggo tutte le righe e le inserisco in un array
Dim lines() As String = IO.File.ReadAllLines(fi)
Using sw As New IO.StreamWriter(fi)
For Each line As String In lines
x += 1

If line.Contains(" ") Then
x = x + 3
Else
sw.WriteLine(line(x))


End If
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5