Newsgroup: it.comp.lang.visual-basic
Titolo: [?] importazione dati da file .txt

ho un problema che devo risolvere al piu' presto e spero che qualcuno di voi
possa aiutarmi. Nonostante le ricerche sul sito comune, su msdn e su google
per i vecchi post, non sono riuscita a trovare qualche aiuto in merito al
mio problema che e' il seguente:
Devo importare dei dati da un file .txt del tipo....
|   prodotto   |  quantita'  |
-------------------------
| processori  |      25      |
|  Sk Audio  |      30      |
|        -         |       0       |
|    H-Disk   |      50      |
| processori |      55       |
|        -        |        0       |
|        -        |        0       |
|  Sk Audio  |      30      |
ecc.
i dati si posizionano in maniera casuale e non occupano quindi sempre la
stessa posizione (come si nota dall'esempio). Io dovrei creare un file sia
.txt che per la stampa del tipo.......
|   prodotto   |  quantita'  |
-------------------------
| processori  |     80      |
|  Sk Audio  |      60      |
|    H-Disk   |      50      |
qualcuno sarebbe cosě gentile da aiutarmi.....
PS. Auguri di buon 2002
-
Ciao Marika


ciao
allora la seguente sub la uso per caricare un file delimitato da "," (comma
separated) in cui le linee sono del tipo:
101,4,"ABBIATI
Christian","Milan",1,0,0,1,6.5,1,6.5,0,0,0,0,0,0,0,0,0,0,0,0,1 etc
penso che se la guardi un attimo con delle modifiche puo' fare al caso tuo.
spero ti possa essere utile e scusa ma nn ho tempo di modificarlo io stesso.
Auguri per il tuo lavoro e di buon anno!
Alessandro
Private Sub caricavoti(filename As String)
On Error GoTo errCaricavoti
Dim rs As New ADODB.Recordset
Dim nfile As Long
Dim Count As Long
Dim found As Long
Dim ASCII As String
Dim value As String
Dim i, intcount As Integer
Dim trovato As Boolean
Dim delimiter, qualifier, decimaldel As String
Dim rs1 As New ADODB.Recordset
Set rs = New ADODB.Recordset
rs.Open ("tb_voti"), conn, 3, 3
ProgressBar1.Max = 520
intcount = 0
trovato = False
qualifier = """"
delimiter = ","
decimaldel = "."
nfile = FreeFile
    ' chiamo la function che controlla se ho già caricato questa giornata
    trovato = cercaGiornata(filename, rs)
    If trovato Then
        Text1.Text = "Giornata già presente nel Database!"
        rs.Close
        Set rs = Nothing
        Exit Sub
    End If
Open filename For Input As #nfile
Do While Not EOF(nfile)
Line Input #nfile, ASCII
    rs.AddNew
    i = 0
    found = -1
    Do While found <> 0
            found = InStr(ASCII, delimiter)
            If found <> 0 Then
                value = Mid$(ASCII, 1, found - 1)
                ASCII = Trim$(Mid$(ASCII, found + 1))
            Else
                value = Trim$(ASCII)
            End If
            If InStr(value, qualifier) <> 0 Then
             value = Replace(value, qualifier, "")
            End If
            If InStr(value, decimaldel) <> 0 Then
             value = Replace(value, decimaldel, ",")
            End If
            rs.Fields(i).value = value
            i = i + 1
    Loop
    rs.Update
    intcount = intcount + 1
    ProgressBar1.value = intcount
Loop
Close #nfile
    ProgressBar1.value = ProgressBar1.Max
rs.Close
Set rs = Nothing
Text1.Text = "Voti Caricati!"
Exit Sub
errCaricavoti:
If Not (Err.Number = 32755) And Not (Err.Source = "ProgCtrl") Then
    MsgBox Err.Description & Chr(13) & Err.Number, , "Carica Voti"
Else
    Resume Next
End If
End Sub

 Alessandro
ti ringrazio innanzitutto per la sollecitudine con cui mi hai risposto...
l'esempio che mi hai postato e' ottimo, ma non fa al mio caso in quanto i
valori che io importo non hanno sempre la stessa posizione, e' come se nel
tuo caso fosse:
"ABBIATI
Christian",101,4,"Milan",1,0,0,1,6.5,1,6.5,0,0,0,0,0,0,0,0,0,0,0,0,1 etc.
Non avendo un riferimento preciso si dovrebbe (a naso) far riconoscere al
programma la stringa del nome prodotto, es.
processori = 5
schede = 3;
- = 0
schede = 5
e quindi sommare i valori 5 e 3 per i processori, il valore 3 per le schede
e 0 per -, togliendo le voci prodotto in più..... creando una cosa tipo
processori = 8
schede = 3
- = 0
spero tu possa aiutarmi a risolvere l'enigma...
-
ciao Marika


temo di non aver capito, infatti dal tuo esempio precedente, nel primo post,
sembrava che a parte le due prime
righe, le altre cominciassero per "|" poi nome del prodotto (chiave) "|"
quantità "|"  a chiudere la riga.
se è così, non sarebbe un problema il fatto che prodotto si possa ritrovare
scorrendo il file perchè basta trovare cercare la chiave
nella tabella che popoli, se non c'e' la aggiungi, se la trovi vai in
aggiornamento del campo qtà.
forse sarebbe il caso che postassi un pezzo di quel file.
ciao,ale
p.s: io sto parlando solo dell'importazione

Non sono sicuro di aver capito ma forse la funzione Split può aiutarti
Dim Ar() as String, St as String
Open "TuoFile.txt"For Input As 1
Do Until Eof(1)
     Line Input #1,St
     Ar=Split(St,"|")
     For i  = 0 to Ubound(Ar)
         if IsNumeric(Trim(Ar(i)))  Then
                ' Val(Ar(i)) é una quantità
         Elseif Len(Trim(Ar(i))>0 Then
                ' Ar(i) è una descrizione
         Endif
     Next
Loop
Close 1
Spero ti possa essere utile
Ciao
--
Fabio Guerrazzi
VB Graphic Developer
http://www.sourcecode4free.com/cgt
fab...@libero.it

[CUT]
grazieeeeeeeeeeeeee... ad Alessandro ed a Fabio,
ho trovato le vostre soluzioni molto utili (scusa Ale per il secondo post,
ma mi sono accorta dopo di aver detto una c....a)....
come sempre SPLENDIDI.....
-
ciao Marika


In effetti mi sono ricreduta, però non riesco ad adattarlo alle mie
esigenze, per me che ho poca esperienza non è tanto semplice cito "se è
così, non sarebbe un problema il fatto che prodotto si possa ritrovare
scorrendo il file perchè basta trovare cercare la chiave
nella tabella che popoli, se non c'e' la aggiungi, se la trovi vai in
aggiornamento del campo qtà". Spero che tu mi possa aiutare....
-
ciao Marika