Newsgroup: it.comp.lang.visual-basic
Titolo: importazione file e doppi apici

Ciao a tutti.    Ho il seguente problema:
devo importare un file testo in una tabella Access.
Il file testo in questione è un anagrafico clienti con i seguenti campi
codice, ragione, indirizzo etc.etc
Il file è in formato comma delimited cioè "01254","nomecliente","indirizzo"
etc.
Il problema nasce dal fatto che nella ragione sociale sono stati usati i
doppi apici per delimitare frasi del tipo "Bar della Posta" etc.
Questo problema fa si che quando apro il file con  Open nomefile as input #1
etc e vado a scrivere sucessivamente i record sul db Access tutto fila
liscio sino a che non incontro dentro ad un campo questi maledetti doppi
apici che mandano in palla tutto.
Ora chiedo.....è possibile dire a VB che i campi iniziano e terminano con la
virgola e non con i doppi apici ????
Spero di essere stato chiaro
Grazie a chi mi aiutera'
mauro...@tin.it

 virgola e non con i doppi apici ????
Intanto NON "iniziano e terminano con la virgola" ma terminano, e basta, con
la virgola tutti tranne l'ultimo.
Poi come leggi i campi? assegnandoli a singole variabili? Potresti leggere
una riga alla volta e usare InStr cercando la virgola (se hai VB6 la cosa si
dovrebbe poter fare in maniera piu' furba, chiedi lumi specifici se qualcun
altro non ne parla) quindi eliminare i doppi apici di troppo prima di
scrivere nel db.
Il codice che segue e' forse un po' pasticciato perche' l'ho estirpato alla
bell'e meglio da altro mio codice (quello funzionante, questo non so...) ma
dovrebbe dare l'idea di quel che intendo:
Option Explicit
Public Sub Main( _
)
Const s_LOC_FULLFILENAME  As String _
  = "C:\Progetti\VB\VB4.0\CSV\Prova.CSV"
Dim i_nFile               As Integer
Dim s_Record              As String
Dim s_Field               As String
Dim i_Field               As Integer
Dim i_Start               As Integer
Dim i_Next                As Integer
Dim l_nRec                As Long
  Let i_nFile = FreeFile(0)
  Open s_LOC_FULLFILENAME For Input As #i_nFile
  Do While Not (EOF(i_nFile))
    Line Input #i_nFile, s_Record
    ' Puoi decidere di saltare la prima riga (dei nomi
    ' dei campi) se esiste.
    'If l_nRec Then
      Let s_Record = "," & s_Record & ","
      Let i_Field = 0
      Let i_Start = 2
      Do While i_Start < Len(s_Record)
        Let i_Next = InStr(i_Start, s_Record, ",")
        If i_Next Then
          Let s_Field _
            = Mid$(s_Record, i_Start, i_Next - i_Start)
          Let i_Start = i_Next + 1
          Let s_Field = FieldText(strField:=s_Field)
          ' Se esiste la prima riga (dei nomi dei campi)
          ' e non l'hai saltata prima, puoi creare i
          ' campi della tabella...
          'If l_nRec Then
            Select Case i_Field
            Case 1
              'Let rs!Campo1 = s_Field
            Case 2
            Case 3
            'Case ...
            Case Else
              ' Errore...
            End Select
            ' oppure, se l'ordine e' lo stesso
            'Let rs.Fields.Item(Index:=i_Field).Value _
            '  = s_Field
          'Else
            ' Crea i campi...
          'End If
          Let i_Field = i_Field + 1
        End If
      Loop
    'End If
    Let l_nRec = l_nRec + 1
  Loop
  Close
End Sub
Private Function FieldText( _
ByVal strField As String _
) As String
Dim i_nChr34  As Integer
Dim b_IsChr34 As Boolean
Dim i_Pos     As Integer
  Let FieldText = Trim$(strField)
  If Len(FieldText) Then
    ' Nell'ipotesi, non improbabile, che ci siano piu'
    ' coppie di doppi apici...
    Do
      Let b_IsChr34 = Left$(FieldText, 1) = Chr$(34)
      If b_IsChr34 Then _
        Let FieldText = Mid$(FieldText, 2)
      Let b_IsChr34 = Right$(FieldText, 1) = Chr$(34)
      If b_IsChr34 Then _
        Let FieldText = Mid$(FieldText, 1, Len(FieldText) - 1)
      Let i_nChr34 = i_nChr34 + 1
    Loop While b_IsChr34
    ' Varia il valore di i_nChr34 in base alla tipologia
    ' dei tuoi dati.
    If i_nChr34 > 2 Then _
      Let FieldText = Chr$(171) & FieldText & Chr$(187)
  End If
  ' Se vuoi, le righe seguenti sostituiscono tutte le
  ' occorrenze dell'apice con l'apostrofo. Procedi in modo
  ' analogo se vuoi sostituire anche gli eventuali doppi
  ' apici all'interno della stringa.
  If Len(FieldText) Then
    Do
      Let i_Pos = InStr(i_Pos + 1, FieldText, Chr$(39))
      If i_Pos Then Mid$(FieldText, i_Pos) = Chr$(96)
    Loop While i_Pos
  End If
End Function
--
Ciao.
Maurizio

> "Maurizio Borrelli" ha scritto per "Mauro Grimaldi"
alcune cose forse utili ed UNA GRAN PORCATA: scusami tanto, era tardi, avevo
sonno insomma tutte le scuse che si possono immaginare quando la si spara un
po' grossa: inutili, comunque.
Quello che ho scritto regge a condizione che... (ancora non ho il coraggio
di scriverlo) ... a condizione che non ci siano virgole nel testo dei campi!
Scusami ancora ma i dati su cui lavoro sicuramente non ne hanno cosi', sul
momento, non ho considerato questa eventualita'. Ritiro tutto e prosperita'.
--
Ciao.
Maurizio

 wrote in message
8b9ta4$cfb$1...@nslave1.tin.it...


Forse può essere una idea balzana ma se ti funziona fammi un ping:
Prova a passare tutto il file e sostituire i "" dopi segni di comma
delimited con un solo delimited "
così dove hai ""Bar della Posta"" avrai "Bar della Posta" e dove
"Nomecliente" semplicemente "Nomecliente"
poi ricomincia da capo con l'importazione e dovresti aver eliminato
l'anomalia di chi ha pensato di usare le " per indicare i nomi in un campo
prosperità
Marco Melchiorre