Leggere un file ascii (txt) con asp net 3.5/4.0

lunedì 07 maggio 2012 - 18.31

trinity Profilo | Guru

Salve ragazzi
ho un server web sul quale ho creato delle pagine aspnet con vb2008. Ho configurato su questo server web iss e la cartella di lavoro come sito web..poi ho creato un file url nel quale ho inserito le credenziali per connettersi al server web e quindi al db sql che punta.
Adesso dovrei leggere un file txt sequenziale, prendere i dati e salvarli nel db che si trova su questo server web. Queste pagine che ho creato sono un piccolo progetto gestionale e il file url di connessione lo do ai miei clienti i quali con una autenticazione accedono sul server, utilizzando le pagine web inseriscono i dati che gestiscono. pertanto questo file txt che devo leggere si trova sui computer dei miei clienti e non sul server web ma i dati come ho detto precedentemente devono essere letti da una pagine aspx che si trova sul server web la quale appunto leggerà e salverà i dati nel db sql.

Ho forse fatto un bel giro di parole ma solo per il motivo che non essendo ancora pratico di aspnet ma ho sempre e solamente lavorato su windows application mi domando se attraverso vb 2008 posso scrivere la lettura di un file txt utilizzando sempre l'oggetto StreamReader e StreamWrite. Altrimenti se sbaglio ditemi dove posso vedere esempi per capire e risolvere il mio problema

Ciao e grazie
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

martinez Profilo | Senior Member

Ciao,

Non credo ci sia la possibilità di poter "leggere" dei file dal client. Quindi serve semplicemente fare l'Upload sul server del file e successivamente leggerlo con il metodo che preferisci per salvarlo sul DB.

Saluti

Gluck74 Profilo | Guru

ciao,
premesso che non ho capito cosa sia e come funzione questo file url di cui parli.....

Confermo la risposta di Martinez:
non è possibile far leggere dalla pagina aspx (server), un file di testo sul client.
Come dice Martinez, devi per forza fare l'upload del file sul server.
Ora, non è obbligatorio salvare prima il file in una cartella per poi leggerlo, poiché puoi riceverlo già come stream quando viene fatto l'upload.
Il salvataggio sul DB rimane quindi identico.

qui un un esempio che fa al caso tuo:
http://www.codeproject.com/Articles/1757/File-Upload-with-ASP-NET

ciao

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

trinity Profilo | Guru

>ciao,
>premesso che non ho capito cosa sia e come funzione questo file
>url di cui parli.....
>
>Confermo la risposta di Martinez:
Immaginavo!!

>Ora, non è obbligatorio salvare prima il file in una cartella
>per poi leggerlo, poiché puoi riceverlo già come stream quando
>viene fatto l'upload.
in che senso questo non saprei farlo ed il post che mi hai linkato è per un'immagine...qualche esempio per un fiel txt?
>
>qui un un esempio che fa al caso tuo:
>http://www.codeproject.com/Articles/1757/File-Upload-with-ASP-NET
>
>ciao
>
>____________
>Ricordati di utilizzare il tasto "Accetta" se i nostri consigli
>ti sono serviti a risolvere il problema.
>È il modo per ringraziare chi ti ha aiutato.

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

slavishdany Profilo | Newbie

non ho letto l'esempio, però se non sbaglio l'immagine viene passata come uno stream, quindi puoi utilizzare il flusso di stream direttamente per il file di testo in questione

Gluck74 Profilo | Guru

ciao,
non importa che l'esempio sia un'immagine o qualsiasi altra cosa.
Quello che importa è che il file appena inviato in upload è presente in uno stream.
Puoi leggere questo stream e farci quello che vuoi: salvarlo sul disco, salvarlo sul DB, elaborarlo, mandarlo in response e chi più ne ha più ne metta.

esempio:
// Get a reference to PostedFile object HttpPostedFile myFile = filMyFile.PostedFile; // Read uploaded file from the Stream TextReader sr = new StreamReader(myFile.InputStream); string allText = sr.ReadToEnd();

naturalmente dovresti prima assicurarti che il file inviato sia un file di testo, quindi fai sempre i dovuti controlli di sicurezza.
ciao


____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

trinity Profilo | Guru

Solo una cosa vorrei capire...con il codice di esempio io attraverso una pagina aspx (che si trova su un server web) posso leggere il file testo su un client e passare lo stream al db remoto?

In base al codice di esempio il file txt deve essere sempre uplodato sul server o sbaglio?

scusate se faccio domande banali devo capire

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

martinez Profilo | Senior Member

NO!!!
non puoi leggere direttamente da un client!!!

Puoi:
1) Fare l'upload, salvare sul server, lavorare come meglio preferisci sul file per salvarlo sul DB, eliminare il file.
2) fare l'upload, eloborarne direttamente lo stream e salvare sul DB ...

Se non riesci ad utilizzare con scioltezza la seconda ipotesi, limitati, anche per capire come meglio organizzare la cosa, ad utilizzare il primo metodo, una volta ottenuto un buon risultato vedrai che trattare lo stream direttamente dall'upload ti risulterà semplice ... semplificandoti la vita.

Saluti

trinity Profilo | Guru

Domanda ma con il framework 4.0 c'è una nuova classe di HttpPostedFile ?

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

martinez Profilo | Senior Member

si esiste certo!

questo è il metodo che ti fa leggere lo stream: HttpPostedFile.InputStream
e qui un esempio su come usarla: http://msdn.microsoft.com/it-it/library/system.web.httppostedfile.inputstream.aspx

Ma è sempre NECESSARIO fare l'upload dei file dal client (ossia utilizzare un controllo tipo HtmlInputFile che può essere utilizzato per selezionare e caricare i file da un client).

la pagina dalla quale partire per la Classe HttpPostedFile è questa: http://msdn.microsoft.com/it-it/library/system.web.httppostedfile(v=vs.80).aspx

Non v'è più sordo .....

Ciao :)

trinity Profilo | Guru

Scusa Gluck il codice che mi hai postato serve a leggere il file in stream ma su l'msdn non ho trovato esempi che mi facciano vedere come prendere il file dal client quindi indicare il suo percorso e poi uplodarlo sul server in un percorso da me specificato.
Ho visto la pagina dove spiega HttpPostedFile.SaveAs ma non mi spiega molto

Lo so che sono pesante nel capire ma su questo argomento sto trovando difficoltà nonostante i vostri aiuti...

Mica hai qualche link dove ti fa vedere come si posta da client a server un file txt in vb net?


modifico il post aggiungendo questo:

nel mio sito ho aggiunto una cartella chiamata FileUpload, poi sulla pagina aspx ho aggiunto l'oggetto fileupload e ho scritto questo codice:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Funziona ora sempre da questa pagina aspx devo leggere il file e salvare i dati nel db a questo punto eseguo questo codice?

Dim miofile As String = "D:\sitoprova\fileupload\C59_aprile.txt"

' Istanzio un nuovo oggetto StreamReader ' Utilizzo il metodo OpenText per aprire il file Dim objStreamReader As StreamReader objStreamReader = File.OpenText(miofile) ' Leggo il contenuto del file sino alla fine (ReadToEnd) Dim contenuto As String = objStreamReader.ReadToEnd() ' Passo al web control (label) il contenuto del file perchè ' venga stampato a video Me.Label1.Text = contenuto ' Chiudo l'oggetto StreamReader objStreamReader.Close()


Secondo voi va bene? adesso se volessi fare come dite voi ossia leggere direttamente un stramreader senza prima salvare il file sul server come dovrei fare?



Ciao e grazie ancora
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

Gluck74 Profilo | Guru

>Lo so che sono pesante nel capire ma su questo argomento sto
>trovando difficoltà nonostante i vostri aiuti...
tranquillo, siamo qui per questo, comunque soffermati a leggere meglio i link che ti suggeriamo, perché la soluzione è sotto il naso (anche se tante volte facciamo difficiltà a trovarla)


>nel mio sito ho aggiunto una cartella chiamata FileUpload, poi
>sulla pagina aspx ho aggiunto l'oggetto fileupload e ho scritto
se hai proprio necessità di salvare il file, ok, ma se lo devi solo mettere nel db, non ti serve


>questo codice:
> omissis
>Funziona ora sempre da questa pagina aspx devo leggere il file
>e salvare i dati nel db a questo punto eseguo questo codice?
>
>// Get a reference to PostedFile object
>HttpPostedFile myFile = filMyFile.PostedFile;
>
>// Read uploaded file from the Stream
>TextReader sr = new StreamReader(myFile.InputStream);
>string allText = sr.ReadToEnd();
>
>??
NO, il codice lo devi semplicemente mettere al posto delle riga
FileUpload1.SaveAs(filePath)

In questo modo non salvi il file fisicamente sul disco, ma in una stringa in memoria.
(attenzione, la stringa è solo per esempio, se vuoi puoi passare direttamente il reader e leggere riga per riga)
Poi passerai la stringa/reader alla funzione che salva sul DB.

L'unica cosa che devi modificare è
If System.IO.File.Exists(filePath) Then
poiché non salvando non puoi fare questo controllo, (a meno che tu non scelga di salvare comunque mantenendo entrambe le istruzioni)

Ciao

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

trinity Profilo | Guru

Ho scritto così solo che mi da errore come se non trovasse il file che ho selezionato

Dim filePath As String = Request.PhysicalApplicationPath If FileUpload1.HasFile Then ' controllo la dimensione del file If FileUpload1.PostedFile.ContentLength > 4000000 Then Response.Write("Il file non può essere caricato perché supera 4MB!") Else ' carico il file nel streamreader Dim objStreamReader As StreamReader objStreamReader = File.OpenText(filePath) ' Leggo il contenuto del file sino alla fine (ReadToEnd) Dim contenuto As String = objStreamReader.ReadToEnd() ' Passo al web control (label) il contenuto del file perchè ' venga stampato a video Me.Label1.Text = contenuto ' Chiudo l'oggetto StreamReader objStreamReader.Close() ' mandiamo un messaggio all'utente Response.Write("File caricato!") End If Else Response.Write("Il file non è stato caricato!") End If

in pratica eseguendo il debug alla voce: filePath += FileUpload1.FileName lui non prende il percorso dove si trova il file che potrebbe stare in c: oppure sul desktop o in documenti ma lo va a cercare dentro la cartella generale del sito/progetto....invece i miei clienti il file lo salvano dove capita e poi se lo vanno a cercare loro e lo caricano

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

Gluck74 Profilo | Guru

ti stai perdendo in un bicchier d'acqua. Cerca di seguire logicamente la cosa:

1. la tua pagina aspx deve contenere un controllo UploadFile che permette di inviare dal client al server un file
2. L'utente utilizza la pagina per inviare un file. Dovunque sia nel PC dell'utente, viene inviato nel al server con il postback
3. Il file NON ESISTE ancora sul server. Lo prelevi utilizzando FileUpload1.PostedFile

quindi:
1 - If FileUpload1.HasFile Then - OK per controllare se è stato inviato un file
2 - If FileUpload1.PostedFile.ContentLength > 4000000 Then - OK per controllare la grandezza del file
3 - aggiungerei il controllo sul tipo di file
4 - objStreamReader = File.OpenText(filePath) - NO, il file non esiste ancora, non lo puoi aprire.
5 - Prendi il contenuto del file direttamente dallo stream con il blocco di codice che ti ho passato:
// Get a reference to PostedFile object HttpPostedFile myFile = filMyFile.PostedFile; // Read uploaded file from the Stream TextReader sr = new StreamReader(myFile.InputStream); string allText = sr.ReadToEnd();
6 - se ti serve ANCHE salvare il file, salvalo: FileUpload1.SaveAs(filePath)
facendo però appunto gli opportuni controllo: filePath DEVE essere una cartella con possibilità di scrittura, il file non deve esistere.

ciao

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

trinity Profilo | Guru

Ci sono riuscito grazie mille ho riletto e ho capito la logica se oi mi servirà qualche altra delucidazione ti farò sapere...Ma ora ho un problema con il componente di ajax asyncuploadfile ma apro un altro post....

Grazie ancora
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

trinity Profilo | Guru

Un ultima cosetta, è possibile che mentre leggo ogni singolo record del file txt ovviamente del stream, tali dati possano essere visualizzati in tempo reale su una list oppure gridview aggiornandosi continuamente fino alla fine del processo di lettura? Se non si può fare, c'è la possibilità di poter comunque far vedere al cliente la lavorazione dei dati del file?

Ti spiego questi dati sono solo codici ma tali codici all'interno del database fanno riferimento per esempio a Nazioni, Regioni e province....vorrei che una volta salvato il primo record di dati nell'apposita tabella poi tale dato codificato sotto forma di descrizione venga visualizzato sulla pagina all'interno di una gridview o list

se ti serve qualche esempio in più dimmelo

Ciao e grazie
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

Gluck74 Profilo | Guru

no, così al volo non potresti.

Ovvero, o vedi tutto a fine elaborazione,
o devi cambiare l'interazione applicando AJAX per poter far vedere le cose al volo come vorresti tu.

Ma ti do un mio modesto parere:
credo che l'elaborazione sia talmente veloce, che vedresti uno scorrere velocissimo di dati che non serve a niente.
Tanto vale che dai il risultato finale senza stare ad impazzire con AJAX.

ciao

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

trinity Profilo | Guru

Ho capito,
ma solo per curiosità anche per una ipotesi futura se volessi qualche componente di ajax dovrei utilizzare?
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

Gluck74 Profilo | Guru

quello che vuoi fare tu non è molto semplice, perché come eventi è tipo una chat.
ovvero nella tua pagina web ci dovrà essere un contenitore (div, textbox, textarea, label... quello che vuoi) che deve essere aggiornato al volo ogni volta che sul server un record viene lavorato.
Proprio come se ci fosse un interlocutore che ti invia un messaggio in chat.

comunque ripeto, l'elaborazione del server sarà talmente veloce che vedresti tutti i messaggi in un colpo solo.

Non so se ci sia un componente apposito per fare questo, ma con del codice custom puoi farlo.
puoi cercare su internet ma non ti so aiutare più di tanto

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

trinity Profilo | Guru

OK farò come hai detto te ossia carico i record alla fine...senti ho aperto un altro post di asynkfileupload mica potresti darci un'occhiata?

;)

Ciao e grazie
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

trinity Profilo | Guru

Ciao scusa se riapro questo argomento..allora ho creato un codice di lettura stream da client al server e funziona perfettamente senza uploadare il file fisicamente sul server ecco il codice:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

ora calcolando che il file ascci ha 1400 record circa ho fatto un calcolo del tempo che ci impiega il mio codice a leggere riga per riga il file e a salvarlo nel db direttamente e ci impiega circa 1 minuto e 45 secondi...
La mia domanda è questa se invece faccio uplodare fisicamente il file sul server e poi da codice leggo il file ed eseguo la stored di inserimento ossia il codice sopraindicato, secondo te la procedura è + veloce oppure i tempi di elaborazione sono sempre gli stessi?
Si tratta solo di un discorso di velocità tutto qua

Ciao ;)
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

Gluck74 Profilo | Guru

no, non cambia praticamente nulla.
salvando il file sul disco, dovrai poi rileggerlo ed eseguire la stessa identica cosa che fai adesso, dalla riga in cui utilizzi lo StreamReader in poi.

Aggiungeresti solo il tempo di accesso al disco (questione di millisecondi).

Casomai se le righe dei file sono molte, vedi se ti può velocizzare la procedura utilizzare un metodo di Bulk Insert sfruttando XML:
http://support.microsoft.com/kb/315968
http://www.dotnetcurry.com/ShowArticle.aspx?ID=323

____________
http://glucolo.wordpress.com
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

trinity Profilo | Guru

Stai dicendo che leggo il fiel in stream ed invice di scriverlo come faccio ora sul database i dati li salvo in un xml e poi uso il burk insert sql?
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

Gluck74 Profilo | Guru

si esatto.
E forse non hai nemmeno bisogno di salvarli sul disco. Li tieni sempre in memoria in formato XML, poi li dai in pasto a SQL per fare l'interimento BULK.
Sicuramente sarà molto più veloce che fare n "INSERT" consecutive.

ciao
____________
http://glucolo.wordpress.com
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

trinity Profilo | Guru

Scusa in uno dei tuoi link in vb net trovo questo:


Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Per capire nella prima parte si scrive una tabella dataset alla fine o sbaglio? Ma nella seconda il datatable viene scritto nel db creando una tabella chiamata Censis?
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

Gluck74 Profilo | Guru

si, l'esempio riportato fa al tuo caso.
Nel primo pezzo riempie una tabella con una sorgente dati, nel secondo pezzo di codice, usando SqlBulkCopy fa una copia dei dati nella tabella di destinazione.


____________
http://glucolo.wordpress.com
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.
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-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5