[VB.NET] File di testo

giovedì 15 settembre 2005 - 12.13

redman83 Profilo | Newbie

Salve a tutti,vi spiego il mio problema:

ho due file di testo: file1 di origine
file2 di backup

Devo fare in modo di copiare il contenuto del file uno nel file due seguendo queste direttive:

Leggere i due file:

- se nel file 1 è presente una riga non presente nel file 2 inseriscila/aggiungila nel file 2;
- se nel file 1 è presente una riga uguale a quella nel file 2 sovrascrivila nel file 2;
- se nel file 1 è presente una riga parzialmente uguale a quella nel file 2 sovrascrivila nel file 2;

il file di testo è strutturato in questo modo:
Ho notato inoltre che leggendo il file alcune righe non vengono copiate per intero ma il puntatore viene mandato a capo in maniera casuale.


ESEMPIO FILE1 & FILE2:


022 scavo su ls per tubolare 06/13/96* - - M úD HD BÓQ­ ° N N
023 scont.+scan.lat.ls battut 04/15/97* Õ Õ M E `D ŸBÓQ© ° S N
024 scont.+scan.lat.is battut 04/15/97* ë ë M E `D ŸBÓQ© ° S N
0244ARCLSSZ5 lav. est. ls spizzura 02/08/05* „ƒM @E @SD žB¸Q© ° A N
0244ARCPCSZ5 lav. est. pc spizzura 02/08/05* ñðM @E €GD žB¸Q© ± N N
025 serratura di sicurezza 12/20/95* ; ; M ÈC –C ŸBÓQÿ ¡ A N
0251PCINT5 pc int bascultech 05/02/05* ¨©M ÀâD €GD žBÝQ­ ½ N N
026 scont.+scan.lat.cs-is.... 06/19/96* ± ² M E `D ŸBÓQ© ° S N
0261 PANNEST5 centrale std vip 01/0104/27/05* . . M úD kD AÝQ­ ° A N
027 scont.+scan.lat.per ls 06/19/96* ™ š M E ‹DffžBÓQ© ° S N


le posizioni dei caratteri sono ovviamente sballate....se qualcuno mi potrebbe aiutare ne sarei grato!

Sono a disposizione per chiarimenti e specifiche dei due file...in caso ne invio una copia via mail.

Grazie

redman83 Profilo | Newbie

E mi puoi indirizzare a qualche esempio di utilizzo? grazie.

redman83 Profilo | Newbie

Scusa ma non ce ne capisco molto, ho sentito perlare dei filestream e ho appreso qualche esempio, mi sai dare qualche indicazione in merito?

Mi potresti aiutare in qualcosina anche nel codice?

grazie...mille

redman83 Profilo | Newbie

Allora quello che devo fare in pertenza:


leggere il file 1
leggere il file 2

while not EOF file 1
leggi riga 1
salvala temporaneamente in una variabile A
while not EOF file 2
leggi riga1
salvala temporaneamente in una variabile B
#confronto# A con B
if A=B then riga1.B = riga1.A
elseif A<>B then (insert riga1.A in riga1.B)

'il controllo dell'uguaglianza deve venir fatto attraverso il confonto di determinati caratteri presenti ad una data posizione all'interno della riga.

loop
loop
close file 1
close file2

Questa è una pseudo-codifica aspetto un aiuto o correzione.

Grazie Mille


redman83 Profilo | Newbie

ma il codice riportato è per VB .NET??????

mi sembra di no :-(

Cteniza Profilo | Guru

Se fai questa domanda mi sorge il dubbio che tu stia postando nella sezione sbagliata (lo voglia fare con vb6 e non con vb.net) oppure in alternativa che tu non abbia la più pallida idea di come realizzarlo con vb.net e aspetti che qualcuno ti scriva l'intero programma.


redman83 Profilo | Newbie

Il programma lo voglio fare in vb .NET ma sono alle prime armi e non capisco molto.

il textreade e il textwriter mi vengono segnalati come errori nel compilatore.

Grazie.

redman83 Profilo | Newbie

Penso ci siamo,dopo un pò di pazienza a leggere e studiare un po.

il codice è il seguente.:

Private Const FILE_NAME As String = "c:\dati\origine0.txt"
Private Const FILE_NAME2 As String = "c:\dati\backup0.txt"

Public Sub readtext()
If File.Exists(FILE_NAME) Then 'se il file esiste
Dim sr As StreamReader = File.OpenText(FILE_NAME) 'inizializzo il file origine dichiarato in sr
Dim sr1 As StreamWriter = File.CreateText(FILE_NAME2) 'inizializzo il file backup dichiarato in sr1
Dim input As String
input = sr.ReadLine() 'inizializza la variabile a contenere il valore di readline
While Not input Is Nothing 'finchè il valore non è nullo
Console.WriteLine(input) 'scrive nella console il valore della variabile
input = sr.ReadLine() 'legge la riga assegnando il valore alla variabile input
sr1.WriteLine(input) 'scrive le righe nel file di output
End While 'fine ciclo

Console.WriteLine("Fine del file") 'scrivi in console il mess fine del file
sr.Close() 'chiudi file
sr1.Close()
Else : MessageBox.Show("Il file origine non esiste!")
End If
End Sub

ora il problema sembra sia che nella copia dal file 1 al file 2 mi salta la prima riga e quando copia riga per riga dal primo file al secondo file non tiene presente dei caratteri speciali.

Esempio:

FILE1
0 *** server primary ******03/24/05* M zD zD zD hyÿ N N
00 *** storico programmi****03/24/05* M zD zD zD hyÿ N N
000 *** backup pgm **********03/24/05* M zD zD zD hyÿ N N
0000 *** server rete b1 ******12/21/01* M zD zD zD f¤ÿ N N
00000 *** server rete b2 ******12/21/01* M zD zD zD f¤ÿ N N
000000 *** server rete b3 ******12/21/01* M zD zD zD f¤ÿ N N
0000000 *** server rete b4 ******12/21/01* M zD zD zD f¤ÿ N N
020 old 1fase fr.diam.24 m1 03/10/99*   M úD HD žBÅQÿ ° S N
021 scavo lat.post.mdf fr.75 06/14/96* _ _ M úD HD BÓQ­ ° S N
022 scavo su ls per tubolare 06/13/96* - - M úD HD BÓQ­ ° N N
023 scont.+scan.lat.ls battut04/15/97* Õ Õ M E `D ŸBÓQ© ° S N
024 scont.+scan.lat.is battut04/15/97* ë ë M E `D ŸBÓQ© ° S N
0244ARCLSSZ5 lav. est. ls spizzura 02/08/05* „ƒM @E @SD žB¸Q© ° A N
0244ARCPCSZ5 lav. est. pc spizzura 02/08/05* ñðM @E €GD žB¸Q© ± N N
0284PBLPINT5 pbl int optima eletta 22/03/05* j j M @E €TD AÝQ© ° N N


FILE2

00 *** storico programmi****03/24/05* M zD zD zD hy N N
000 *** backup pgm **********03/24/05* M zD zD zD hy N N
0000 *** server rete b1 ******12/21/01* M zD zD zD f N N
00000 *** server rete b2 ******12/21/01* M zD zD zD f N N
000000 *** server rete b3 ******12/21/01* M zD zD zD f N N
0000000 *** server rete b4 ******12/21/01* M zD zD zD f N N
020 old 1fase fr.diam.24 m1 03/10/99*   M D HD BQ S N
021 scavo lat.post.mdf fr.75 06/14/96* _ _ M D HD BQ S N
022 scavo su ls per tubolare 06/13/96* - - M D HD BQ N N
023 scont.+scan.lat.ls battut04/15/97* M E `D BQ S N
024 scont.+scan.lat.is battut04/15/97* M E `D BQ S N
0244ARCLSSZ5 lav. est. ls spizzura 02/08/05* M @E @SD BQ A N
0244ARCPCSZ5 lav. est. pc spizzura 02/08/05* M @E GD BQ N N
0284PBLPINT5 pbl int optima eletta 22/03/05* j j M @E TD AQ N N


grazie mille a tutti per la collaborazione!!!!

cmarco15 Profilo | Newbie

Nuovo della community





Utente dal: 30-09-2007
Messaggi: 1


Ciao ragazzi,

ho bisogno di aiuto per esportare dei dati da un file .LIS (consideriamo come se fosse .TXT)



Dunque:



All'interno del file che dobbiamo analizzare ho i dati che si trovano o dopo la stringa A o dopo la stringa B entrambe in una riga sconosciuta ma comunque dopo la 100esima riga.

Quindi dovrei iniziare la ricerca dei dati (o meglio della stringa A o B) dalla 100edima riga.



Una volta trovata A o B, nella riga successiva si trovano 5 colonne di numeri leggermente spostati rispetto al'inizio delle riga, come ad esempio (uso il carattere _ come se fosse lo spazio):



_________456.982_______ 98345.44_______ 8875.3

________-548.980________ -393.730_________ -9.3

____________ 5.0_____________ 45__________ 45

C



Tali dati devono essere letti fino a quando non si incontra la stringa C

In realtà non so a priori la lunghezza di questi numeri so solo che sono incolonnati a destra.



Bene, secondo voi come posso estrarre le colonne con una macro VBA in excel

e poi scriverli su un file di testo nuovamente incolonnati in questo modo?



Potete aiutarmi, è veramente urgente per la mia tesi!!



Grazie,

potete rispondere anche sulla mia e-mai: ge-vt@libero.it





CIAO



MArco

icchio Profilo | Newbie

Chiedo scusa...non ho capito molto di cosa devi fare....cmq ho capito che devi lavorare su le stringhe...
ti posto un apio di righe che io utilizzo spesso....magari ti sono d'aiuto...

app = Mid(setread, InStr(setread, "-") + 1) ----> questa è per spezzare la stringa mid('nomevariabile','posizione inizio','posizionefinale') l'InStr staper identificare un carattere da cui iniziare nella parentesi trovi il nome della variebile e il carattere da cercare.

in poche parole quella che vedi sopra scrive in app il contenuto dellla stringa setread a partire dal carattere successivo(+1) al primo '-' che trova......
naturalemte se avessi messo mid(setread,1,instr(setread,"-")) avrebbe scritto dall'inizio della stringa fino al primo meno incontrato.

If System.IO.File.Exists("pathfile") Then --> controllo che verifica l'esistenza di un file
System.IO.File.WriteAllText(Application.StartupPath + "filepath", 1) ------>scrive in un file la variabile o il valore dopo la virgola

setread = System.IO.File.ReadAllText("path") ---> legge il contenuto di un file e lo inserisce in una variabile.

non so se ti sono stato di aiuto.....
cmq ci sono moltissime altre cose su le stringhe che sicuramente tanti altri sanno molto meglio di me!

CIAO!!
Stay Safe.

suabrio Profilo | Newbie

Buongiorno a tutti,
io stò cercando di leggere delle righe da un file txt, splittare i vari campi e inserirle in un db sql..
Sono riuscito a realizzare tutte queste operazioni, ma ho un problemino, Streamreader mi legge una riga si e una no... non riesco a capire perchè..
qualcuno ha qualche idea?

Grazie

' Conto il numero di righe del file
Dim lines As String() = IO.File.ReadAllLines(nomefiletemp)

num_righe = lines.Length()


' Connessione a DB

Dim DS As DataSet
Dim MyConnection As SqlConnection
Dim MyDataAdapter As SqlDataAdapter

'Create a connection to the SQL Server.
MyConnection = New SqlConnection("Data Source=ancia;Initial Catalog=test_db;Integrated Security=True")


'Richiamo la sp che legge l'ID dell'ultimo record inserito avente anno uguale all'attuale

MyDataAdapter = New SqlDataAdapter("sp_NCampi", MyConnection)
MyDataAdapter.SelectCommand.CommandType = CommandType.StoredProcedure


MyDataAdapter.SelectCommand.Parameters.Add(New SqlParameter("@pANNO", SqlDbType.Int))

MyDataAdapter.SelectCommand.Parameters("@pANNO").Value = Now.Year

DS = New DataSet() 'Create a new DataSet to hold the records.
MyDataAdapter.Fill(DS, "sp_NCampi") 'Fill the DataSet with the rows returned.

' Numero di record restituiti
num_ID = CInt(DS.Tables(0).Rows.Count().ToString())

' Valore record ordinato
If num_ID = 0 Then
val_ID = 0
Else
val_ID = CInt(DS.Tables(0).Rows(0).Item(0))
End If



MyDataAdapter.Dispose() 'Dispose of the DataAdapter.
MyConnection.Close() 'Close the connection.


' Ora conosco il valore di riga da cui iniziare a leggere..


' Testo se il valore di righe del file è maggiore del numero di record in DB +1
' se non lo è non serve aggiungere

If num_righe > (val_ID + 1) Then
' eseguo aggiornamento


Try

Using sr1 As StreamReader = New StreamReader(nomefiletemp)
i = 0

' temp1 = sr1.ReadLine()
Do Until i = (val_ID + 1)
temp1 = sr1.ReadLine()
i = i + 1

Loop

Do Until sr1.ReadLine Is Nothing

temp1 = sr1.ReadLine()
If i > 0 And temp1 <> Nothing Then

COLNU = CInt(call_class.ExtractWords(temp1, ";")(0))
QUALI = CInt(call_class.ExtractWords(temp1, ";")(1))
ANNO = CInt(call_class.ExtractWords(temp1, ";")(2))
MESE = CInt(call_class.ExtractWords(temp1, ";")(3))
GIORNO = CInt(call_class.ExtractWords(temp1, ";")(4))
DIA_NOM = CInt(call_class.ExtractWords(temp1, ";")(5))
DIA_REAL = CInt(call_class.ExtractWords(temp1, ";")(6))
'LINEA = CInt(call_class.ExtractWords(temp1, ";")(7))
FmN = CInt(call_class.ExtractWords(temp1, ";")(9))
Reh = CInt(call_class.ExtractWords(temp1, ";")(11))
Rm = CInt(call_class.ExtractWords(temp1, ";")(12))
Feh = CInt(call_class.ExtractWords(temp1, ";")(13))
Rm_Re = CInt(call_class.ExtractWords(temp1, ";")(14))
PESO_M = CInt(call_class.ExtractWords(temp1, ";")(17))
End If


'Create a DataAdapter, and then provide the name of the stored procedure.
MyDataAdapter = New SqlDataAdapter("sp_InsData", MyConnection)

'Set the command type as StoredProcedure.
MyDataAdapter.SelectCommand.CommandType = CommandType.StoredProcedure




'Create and add a parameter to Parameters collection for the stored procedure.
MyDataAdapter.SelectCommand.Parameters.Add(New SqlParameter("@pID", SqlDbType.Int))
MyDataAdapter.SelectCommand.Parameters.Add(New SqlParameter("@pTIMESTAMP", SqlDbType.DateTime))
MyDataAdapter.SelectCommand.Parameters.Add(New SqlParameter("@pCOLNU", SqlDbType.Int))
MyDataAdapter.SelectCommand.Parameters.Add(New SqlParameter("@pQUALI", SqlDbType.Int))
MyDataAdapter.SelectCommand.Parameters.Add(New SqlParameter("@pANNO", SqlDbType.Int))
MyDataAdapter.SelectCommand.Parameters.Add(New SqlParameter("@pMESE", SqlDbType.Int))
MyDataAdapter.SelectCommand.Parameters.Add(New SqlParameter("@pGIORNO", SqlDbType.Int))
MyDataAdapter.SelectCommand.Parameters.Add(New SqlParameter("@pDIA_NOM", SqlDbType.Int))
MyDataAdapter.SelectCommand.Parameters.Add(New SqlParameter("@pDIA_REAL", SqlDbType.Int))
MyDataAdapter.SelectCommand.Parameters.Add(New SqlParameter("@pFmN", SqlDbType.Int))
MyDataAdapter.SelectCommand.Parameters.Add(New SqlParameter("@pReh", SqlDbType.Int))
MyDataAdapter.SelectCommand.Parameters.Add(New SqlParameter("@pRm", SqlDbType.Int))
MyDataAdapter.SelectCommand.Parameters.Add(New SqlParameter("@pFeh", SqlDbType.Int))
MyDataAdapter.SelectCommand.Parameters.Add(New SqlParameter("@pRm_Re", SqlDbType.Int))
MyDataAdapter.SelectCommand.Parameters.Add(New SqlParameter("@pPESO_M", SqlDbType.Int))



MyDataAdapter.SelectCommand.Parameters("@pID").Value = i
MyDataAdapter.SelectCommand.Parameters("@pTIMESTAMP").Value = Now
MyDataAdapter.SelectCommand.Parameters("@pCOLNU").Value = COLNU
MyDataAdapter.SelectCommand.Parameters("@pQUALI").Value = QUALI
MyDataAdapter.SelectCommand.Parameters("@pANNO").Value = ANNO
MyDataAdapter.SelectCommand.Parameters("@pMESE").Value = MESE
MyDataAdapter.SelectCommand.Parameters("@pGIORNO").Value = GIORNO
MyDataAdapter.SelectCommand.Parameters("@pDIA_NOM").Value = DIA_NOM
MyDataAdapter.SelectCommand.Parameters("@pDIA_REAL").Value = DIA_REAL
MyDataAdapter.SelectCommand.Parameters("@pFmN").Value = FmN
MyDataAdapter.SelectCommand.Parameters("@pReh").Value = Reh
MyDataAdapter.SelectCommand.Parameters("@pRm").Value = Rm
MyDataAdapter.SelectCommand.Parameters("@pFeh").Value = Feh
MyDataAdapter.SelectCommand.Parameters("@pRm_Re").Value = Rm_Re
MyDataAdapter.SelectCommand.Parameters("@pPESO_M").Value = PESO_M



MyDataAdapter.SelectCommand.Parameters("@pID").Direction = ParameterDirection.Input
MyDataAdapter.SelectCommand.Parameters("@pTIMESTAMP").Direction = ParameterDirection.Input
MyDataAdapter.SelectCommand.Parameters("@pCOLNU").Direction = ParameterDirection.Input
MyDataAdapter.SelectCommand.Parameters("@pQUALI").Direction = ParameterDirection.Input
MyDataAdapter.SelectCommand.Parameters("@pANNO").Direction = ParameterDirection.Input
MyDataAdapter.SelectCommand.Parameters("@pMESE").Direction = ParameterDirection.Input
MyDataAdapter.SelectCommand.Parameters("@pGIORNO").Direction = ParameterDirection.Input
MyDataAdapter.SelectCommand.Parameters("@pDIA_NOM").Direction = ParameterDirection.Input
MyDataAdapter.SelectCommand.Parameters("@pDIA_REAL").Direction = ParameterDirection.Input
MyDataAdapter.SelectCommand.Parameters("@pFmN").Direction = ParameterDirection.Input
MyDataAdapter.SelectCommand.Parameters("@pReh").Direction = ParameterDirection.Input
MyDataAdapter.SelectCommand.Parameters("@pRm").Direction = ParameterDirection.Input
MyDataAdapter.SelectCommand.Parameters("@pFeh").Direction = ParameterDirection.Input
MyDataAdapter.SelectCommand.Parameters("@pRm_Re").Direction = ParameterDirection.Input
MyDataAdapter.SelectCommand.Parameters("@pPESO_M").Direction = ParameterDirection.Input


DS = New DataSet() 'Create a new DataSet to hold the records.
MyDataAdapter.Fill(DS, "sp_InsData") 'Fill the DataSet with the rows returned.

MyDataAdapter.Dispose() 'Dispose of the DataAdapter.
MyConnection.Close() 'Close the connection.
val_ID = val_ID + 1




i = i + 1

Loop

sr1.Close()


End Using
Catch ex As Exception

Dim strMsg As String
strMsg = "Errore di Sistema!" & vbCrLf
strMsg += ex.Message
MsgBox(strMsg)

End Try



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