Newsgroup: it.comp.lang.visual-basic
Titolo: aiuto

Sono un principiante ed ho bisogno di aiuto.
Supponiamo di avere su un file di testo le seguenti stringhe:
5290122170320203050170000301302022
5390121430320203050170000141302022
5400121720420203050170000181302022
5400122170320203050170000171302022
e su un'altro file i seguenti dati:(CAMPI SEPARATI DA ; O DA ,)
MARIO ROSSI;301302022
LUIGI VERDI;141302022
CARLO BIANCHI1;181302022
MARCELLO NERI;171302022
::::::::::::::::::::::::
le ultime 9 cifre delle stringhe del 1° file sono abbinate sul 2° file
a dei nomi.
Quello che voglio ottenere è questo risultato su un unico file,( abbinando i
nomi
alle rispettive stringhe):
5290122170320203050170000301302022;MARIO ROSSI
5390121430320203050170000141302022;LUIGI VERDI
5400121720420203050170000181302022;CARLO BIANCHI
5400122170320203050170000171302022;MARCELLO NERI
.Questo risultato lo ho già ottenuto con excel VBA
come posso invece fare per fare con vb x interfacciare i 2 file
di testo senza dover usare excel?
grazie di cuore
Roberto.

"Roberto" ha scritto:

Un abbozzo di soluzione è:
  Dim x1 As String
  Dim x2 As String
  Open "c:\file1.txt" For Input As #1
  Open "c:\file3.txt" For Output As #3
  Do Until EOF(1)
    Input #1, x1
    Open "c:\file2.txt" For Input As #2
    Do Until EOF(2)
      Input #2, x2
      If Right(x2, 9) = Right(x1, 9) Then
        Print #3, x1 & ";" & Left(x2, Len(x2) - 10)
        Exit Do
      End If
    Loop
    Close #2
  Loop
  Close #1, #3

"Puntino ."
[..........]
Dimenticavo di precisare che:
file1.txt è quello con le righe del tipo: 5290122170320203050170000301302022
file2.txt è quello con le righe del tipo: MARIO ROSSI;301302022
file3.txt è il risultato finale.
Dimenticavo anche il ciao......

 Sono un principiante ed ho bisogno di aiuto.
    Di regola non bisognerebbe mai rispondere ad un post che abbia come
oggetto "aiuto". Vuoi sapere perche'? Visita il "Sito comune" di questo ng:
 
http://www.it-lang-vb.net/
e, in particolare:
 
http://www.it-lang-vb.net/docs/Manifesto.txt
ma, siccome dici di essere un principiante, per stavolta... :)

    Quello che scrivi fa venire il sospetto che le cose non stiano come ci
dici.
    La frase che insospettisce di piu' e' quella in cui scrivi: "le ultime 9
cifre delle stringhe del 1° file sono abbinate sul 2° file a dei nomi.".
Perche' e' in contraddizione con l'esempio. Infatti che bisogno ci sarebbe
di questa informazione? Dato che *evidentemente* i due file *sono composti
dallo stesso numero di righe* ed i record di un file gia' *corrispondono* ai
record dell'altro.
    Altra cosa che insospettisce e' il fatto che dichiari di aver gia'
ottenuto il risultato che ti interessa facendo uso del Visual Basic di
Excel. Dato che dichiari anche di essere un principiante se ne deduce che
non dovresti aver scritto niente di particolarmente complicato o
sofisticato.
    Quindi *potrebbe bastare* scrivere:
' ------------------------------------------------------------
  Option Explicit
' ------------------------------------------------------------
' ------------------------------------------------------------
  Public Const gc_sMsgErrTitle = "ERRORE#"
' ------------------------------------------------------------
' ************************************************************
  Private Sub Main()
' ------------------------------------------------------------
  On Error GoTo errh
' ------------------------------------------------------------
  Const c_sPath = "C:\<percorso>\"
  Const c_sNomeFileDati = c_sPath & "DATI.TXT"
  Const c_sNomeFileNomi = c_sPath & "NOMI.TXT"
  Const c_sNomeFileOutput = c_sPath & "DATIENOMI.TXT"
' ------------------------------------------------------------
  Dim iFileDati   As Integer
  Dim iFileNomi   As Integer
  Dim iFileOutput As Integer
  Dim sLineDati   As String
  Dim sLineNomi   As String
  Dim sLineOutput As String
' ------------------------------------------------------------
  iFileDati = FreeFile(0)
  Open c_sNomeFileDati For Input Access Read As iFileDati
  iFileNomi = FreeFile(0)
  Open c_sNomeFileNomi For Input Access Read As iFileNomi
  iFileOutput = FreeFile(0)
  Open c_sNomeFileOutput For Output Access Write As iFileOutput
  Do While EOF(iFileDati) = False
    Line Input #iFileDati, sLineDati
    Line Input #iFileNomi, sLineNomi
    sLineOutput = sLineDati & ";" & Split(sLineNomi, ";")(0)
    Print #iFileOutput, sLineOutput
  Loop
ext:
  Close
  Exit Sub
errh:
  With Err
    MsgBox .Description, vbCritical, gc_sMsgErrTitle & .Number
  End With
  Resume ext
  End Sub
' ************************************************************
OUTPUT:
5290122170320203050170000301302022;MARIO ROSSI
5390121430320203050170000141302022;LUIGI VERDI
5400121720420203050170000181302022;CARLO BIANCHI1
5400122170320203050170000171302022;MARCELLO NERI
che, come vedi, tranne per quel "CARLO BIANCHI1", probabile errore di
battitura, da' il risultato atteso.
    Ma... Stanno veramente cosi' le cose?
--
Ciao.
Maurizio
--------
?SPQR(C)
 X
--------

"Roberto"  ha scritto:
[.........]
Naturalmente ci devi dire se l'esempio che hai fatto dei due file di testo è
casuale (e 1uindi anche la disposizione delle righe) oppure se c'è perfetta
corrispondenza tra le righe del primo e quelle del secondo. Io , per
trattare il caso piu' generale, nella mia proposta di soluzione ho supposto
che le righe del secondo file possano trovarsi in un ordine arbitrario
rispetto a quelle del primo.
Ciao

 > "Roberto" [...]:
[...]

    Puntino ., scusa, volevo dirlo poi ho dimenticato: credo, ovviamente,
che la soluzione giusta sia la tua.
    Ho scritto quel che ho scritto per sottolineare quanto sia importante,
nel porre quesiti, precisare bene i termini della questione e per dimostrare
quanto sia ancora piu' importante non fare esempi fuorvianti. Spero di
esserci riuscito.


 ha scritto nel messaggio
news:af4230$b03be$3...@ID-52090.news.dfncis.de...


 Credo che non utilizzando excel il tutto sia piu' veloce.
    Dipende...
    Ti propongo un esempio:
' ------------------------------------------------------------
  Option Explicit
' ------------------------------------------------------------
' ------------------------------------------------------------
  Public Const gc_sMsgErrTitle = "ERRORE#"
' ------------------------------------------------------------
' ************************************************************
  Private Sub Main()
' ------------------------------------------------------------
  On Error GoTo errh
' ------------------------------------------------------------
  Const c_sPath = "C:\<percorso>\"
  Const c_sNomeFileDati = c_sPath & "DATI.TXT"
  Const c_sNomeFileNomi = c_sPath & "NOMI.TXT"
  Const c_sNomeFileOutput = c_sPath & "DATIENOMI.TXT"
  Const c_sNomiDelimiter = ";"
  Const c_lNomiFieldNumNome = 0
  Const c_lNomiFieldNumId = 1
  Const c_lDatiFieldIdPos = 26
  Const c_lDatiFieldIdLen = 9
  Const c_sOutputDelimiter = ";"
' ------------------------------------------------------------
  Dim colNomi     As Collection
  Dim iFileDati   As Integer
  Dim iFileNomi   As Integer
  Dim iFileOutput As Integer
  Dim sLineDati   As String
  Dim sLineNomi   As String
  Dim sLineOutput As String
  Dim sId         As String
  Dim sNomi()     As String
' ------------------------------------------------------------
  iFileNomi = FreeFile(0)
  Open c_sNomeFileNomi For Input Access Read As iFileNomi
  Set colNomi = New Collection
  Do Until EOF(iFileNomi)
    Line Input #iFileNomi, sLineNomi
    sNomi = Split(sLineNomi, c_sNomiDelimiter)
    colNomi.Add _
        sNomi(c_lNomiFieldNumNome) _
      , "K" & sNomi(c_lNomiFieldNumId)
  Loop
  Close
  iFileDati = FreeFile(0)
  Open c_sNomeFileDati For Input Access Read As iFileDati
  iFileOutput = FreeFile(0)
  Open c_sNomeFileOutput For Output Access Write As iFileOutput
  Do Until EOF(iFileDati)
    Line Input #iFileDati, sLineDati
    sId = Mid$(sLineDati, c_lDatiFieldIdPos, c_lDatiFieldIdLen)
    sLineOutput _
      = sLineDati _
      & c_sOutputDelimiter _
      & colNomi("K" & sId)
    Print #iFileOutput, sLineOutput
  Loop
  Close
  iFileOutput = FreeFile(0)
  Open c_sNomeFileOutput For Input Access Read As iFileOutput
  Debug.Print Input$(LOF(iFileOutput), iFileOutput)
ext:
  Close
  Set colNomi = Nothing
  Exit Sub
errh:
  With Err
    MsgBox .Description, vbCritical, gc_sMsgErrTitle & .Number
  End With
  Resume ext
  End Sub
' ************************************************************
OUTPUT:
5290122170320203050170000301302022;MARIO ROSSI
5390121430320203050170000141302022;LUIGI VERDI
5400121720420203050170000181302022;CARLO BIANCHI1
5400122170320203050170000171302022;MARCELLO NERI
--


 di testo senza dover usare excel?
non consiglio nè a te nè a nessun altro nel newsgroup di tentare una 
soluzione basata su Collection o cavolate simili. Tendono, con quantità 
di dati abbastanza grandi, a fare schifo. Se il formato dei dati cambia 
vanno praticamente riscritte. Per cui consiglio di usare un database. 
Nella fattispecie, uno dei driver di Jet fa proprio al caso tuo:
'*****
'ATTENZIONE ATTENZIONE: è la prima volta in tutta la mia vita che uso
'ADO, nonchè la prima volta che faccio un programma in VB che manipoli
'basi di dati. Controllate quanto segue, per il bene comune
'*****
Sub main()
  Dim connection As ADODB.connection
  Set connection = New ADODB.connection
  connection.ConnectionString =
    "Provider=MSDASQL;" & _
    "ExtendedProperties="""" & _
      "DefaultDir=.;" & _
      "Driver={Microsoft Text Driver (*.txt; *.csv)};" & _
    """"
  connection.Open
  Dim records As ADODB.Recordset, record As Variant
  Set records = connection.Execute _
  ( _
   "INSERT INTO `finale.txt` " & _
   "SELECT numero,nome " & _
   "FROM `nominativi.txt`,`numeri.txt` " & _
   "WHERE indice=RIGHT(numero,9)" _
  )
End Sub
'*****
NOTE: il file con i numeracci si chiama numeri.txt, quello con nomi e 
numeri nomi.txt, il file di output finale.txt. Il file nominativi.txt 
deve essere separato solo con puntevvirgola - limitazione del driver. 
Il programma deve essere lanciato da dentro la directory che contiene 
questi tre file, e nella stessa directory deve essere presente un file 
schema.ini contenente quanto segue:
[nominativi.txt]
ColNameHeader=False
Format=Delimited(;)
CharacterSet=ANSI
Col1=NOME Char Width 255
Col2=INDICE Char Width 50
[numeri.txt]
ColNameHeader=False
Format=FixedLength
CharacterSet=ANSI
Col1=NUMERO Char Width 50
[finale.txt]
ColNameHeader=False
Format=Delimited(;)
CharacterSet=ANSI
Col1=NUMERO Char Width 50
Col2=NOME Char Width 255
Il programma ovviamente è migliorabile. Ad esempio, potresti smettere 
di usare file di testo del tutto
-- 
 < 
http://www.reactos.com/
 >  Open source clone of Windows NT. Current
     Don't stand, REACT!      version 0.0.19. C, C++ and ASM developers
                              and beta testers are welcome!

 End Sub
ovviamente qui manca un connection.Close


   Dim records As ADODB.Recordset, record As Variant
                 /--------------> ^^^^^^^^^^^^^^^^^^^
ooops. Questo --/ è di troppo. Residui di prove tecniche
