Newsgroup: it.comp.lang.visual-basic
Titolo: Un filtro... complesso

Ho un file di testo da filtrare:
Uno stralcio del file1, molto corposo, è questo:
file1
a|123|torino|4
b|423|madrid|14
c|643|parigi|3
b|100|berlino|32
e|123|milano|234
2|100|brehma|12
Poi ho un'altro file2, sempre corposo, tipo:
file2
123|ITALIA
423|SPAGNA
643|FRANCIA
100|GERMANIA
Dovrei "filtrare" il file1 tramite i codici del file2 ed ottenere:
file3
a|ITALIA|torino|4
b|SPAGNA|madrid|14
c|FRANCIA|parigi|3
b|GERMANIA|berlino|32
e|ITALIA|milano|234
2|GERMANIA|brehma|12
Mi sto perdendo in un mare di cicli if, for... replace... senza nessun
risultato, quindi qualsiasi suggerimento è ben accetto.
Grazie

 ha scritto nel messaggio
news:43479552$0$8484$5fc...@news.tiscali.it...

Suggerimento A: importa i file file1 e file2 in 2 tabelle di un DB Access, apri
un recordset basandolo su una query che effettua un join delle due tabelle sul
campo codice e scrivi i record così ottenuti nel file 3
Suggerimento B: costruisci inizialmente una sorta di lookup-table caricando
tutto (sì tutto il file2 in una collection in cui la chiave è esattamente il
codice.
Codice = <primo campo di file2>
Descrizione = <secondo campo di file2>
MyCollection.Add Descrizione, Codice
Poi scandisci il file 1 e man mano scrivi sul file 3 andando a cercare la
descrizione nella collection
Codice = <secondo campo di file1>
Descrizione = MyCollection(Codice)
Puoi usare anche un array al posto di una collection, ma poi perdi la capacità
di indicizzazione di quest'ultima... in pratica ti tocca fare una ricerca
iterando gli elementi.
Bye
Raf

 Descrizione = MyCollection(Codice)
Di questa soluzione mi piace il fatto che non si "appoggi" ad un db, ma non
conosco bene le collection :-(.
Anche qui, vado di google ed F1.
Insomma mi hai dato 2 valide soluzioni... proverò ad applicarne una delle 2,
devo capire se è più "rognosa" la A o la B.
Grazie

 Grazie
Aggiungo questo: nel prendere la decisione non limitarti alla "rognosità"
apparente della soluzione, cerca di essere lungimirante e capire se una o
l'altra è più adatta ad eventuali sviluppi futuri del tuo progetto. Magari una
si rivela poco performante, con grandi quantità di dati...
Ciao
Raf

Ok, lavorare con il db access mi sembra la soluzione migliore...però... ecco
l'intoppo.
Ho creato il db con la tabella per accogliere i dati del file .txt da access
(si può far fare questo da visual basic? - questo sarà il prossimo passo).
Cerco di passare i dati del file .txt alla tabella tramite questo codice:
cn2.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & mydir &
"\forFM.mdb"
  Open "_buffer.txt" For Input As #1
  Do While Not EOF(1)
  Line Input #1, riga
  r = Split(riga, "|")
  SQL = "INSERT INTO tab1" _
      & "(val1, elenco, val2, modi, tota, FSn, GiorA, GioFL, Comp) " _
      & "VALUES " _
      & "('" & r(0) & "', " _
      & "'" & r(1) & "', " _
      & "'" & r(2) & "', " _
      & "'" & r(3) & "', " _
      & "'" & r(4) & "', " _
      & "'" & r(5) & "', " _
      & "'" & r(6) & "', " _
      & "'" & r(7) & "', " _
      & "'" & r(8) & "')"
  Loop
  Close #1
  cn2.Close
A questo punto, però nella tabella trovo solo le prime 11 righe del file txt
che ne contiene centinaia... dove sbaglio?
Credo che da qualche parte mi manchi un "cn2.Execute (SQL)"...

 Credo che da qualche parte mi manchi un "cn2.Execute (SQL)"...
Ti sei risposto da solo!
Bye

 Bye
Per favore... dove va messo?!?!?
Io l'avrei messo prima del loop, ma cosě mi da errore in debug "tipi di dati
non corrispondenti nell'espressione criterio", dopo il loop prima del
close#1 non sortisce l'effetto desiderato (passa solo le prime 11 righe
perchč poi...), dopo il close#1 prima del cn2.close niente. Solo le prime 11
righe.

 ha scritto nel messaggio
news:4347da6c$0$8488$5fc...@news.tiscali.it...

Ragiona... ad ogni ciclo del loop leggi una riga dal file... ad ogni ciclo
la dovrai pure accodare alla tabella, o no?
Quindi va dentro il loop.
L'errore che ti salta fuori non dipende tanto dalla posizione della Execute,
ma da qualcosa di sintatticamente scorretto nella costruzione della stringa
SQL: lascia che ti si blocchi in debug, poi vai nella finestra Immediate e
stampa il contenuto della variabile SQL.
Ciao

 SQL.
L'ho fatto, il debug.print di SQL mi da tutti i valori di una riga. (Per
l'esattezza della prima riga letta) .
Sto cercando con google ma, sembra impossibile, non riesco a trovare un
esempio che faccia al caso mio...
grazie comunque per l'aiuto.
Ciao

> Ragiona...
[cut]
Risolto... porcaccia vaccaccia... l'errore era nella formattazione della
tabella di access, passavo una stringa r() in un campo "numerico".
Grazie.