Autore Topic: Database: caratteri accentati  (Letto 1100 volte)

Offline dregi

  • Gambero
  • **
  • Post: 85
  • Non possum tuis usque tandem abutere patientiae?
    • Mostra profilo
Database: caratteri accentati
« il: 24 Settembre 2019, 15:33:19 »
Ho trasferito dei dati da una tabella Access a Postgres su campi char e i caratteri accentati e non solo, mi appaiono come nell'immagine. Come dovrei procedere per evitare questo inconveniente?
« Ultima modifica: 24 Settembre 2019, 15:34:11 da dregi »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.158
  • Tonno verde
    • Mostra profilo
Re:Database: caratteri accentati
« Risposta #1 il: 24 Settembre 2019, 15:41:59 »
Ho trasferito dei dati da una tabella Access a Postgres su campi char e i caratteri accentati e non solo, mi appaiono come nell'immagine. Come dovrei procedere per evitare questo inconveniente?

Devi usare Conv$:

Codice: [Seleziona]
StringaUTF-8 = Conv$(StringaNonUTF , "WINDOWS-1253", "UTF-8")
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline dregi

  • Gambero
  • **
  • Post: 85
  • Non possum tuis usque tandem abutere patientiae?
    • Mostra profilo
Re:Database: caratteri accentati
« Risposta #2 il: 24 Settembre 2019, 15:59:44 »
....e qua casca l'asino!.... io purtroppo non faccio la conversione da codice, ma con DBeaver, che tu non hai mai usato, ma che comunque non dà la possibilità, almeno credo, di scrivere SQL... sono le prime volte anche per me con  DBeaver...
Gianluigi, mi diresti come faresti tu da terminale con Posgres ?  La mia tabella iniziale su file csv si compone di tre colonne: nome, codice, ditta; quella di arrivo in Postgres lo stesso.
Oppure potrei tentare una modifica del file csv con Conv$ prima di leggere il file?
« Ultima modifica: 24 Settembre 2019, 16:02:06 da dregi »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.158
  • Tonno verde
    • Mostra profilo
Re:Database: caratteri accentati
« Risposta #3 il: 24 Settembre 2019, 17:04:33 »
....e qua casca l'asino!.... io purtroppo non faccio la conversione da codice, ma con DBeaver, che tu non hai mai usato, ma che comunque non dà la possibilità, almeno credo, di scrivere SQL... sono le prime volte anche per me con  DBeaver...
Gianluigi, mi diresti come faresti tu da terminale con Posgres ?  La mia tabella iniziale su file csv si compone di tre colonne: nome, codice, ditta; quella di arrivo in Postgres lo stesso.
Tu non hai ancora afferrato il concetto.
Quel pochissimo che ho combinato con Postgres, l'ho fatto seguendo le direttive di sotema: uso il terminale esclusivamente per creare il titolare del database e il database vuoto.
Tutto il resto lo faccio direttamente con Gambas.
Io l'unica volta che ho importato dei dati da Access (ma non ho più Windows dal 2015) ho creato da Access i file CSV con un wizard scegliendo il punto e virgola come delimitatore.
Puoi vedere questo codice di fsurfing leggermente modificato se funziona e ti ispira.

Citazione
Oppure potrei tentare una modifica del file csv con Conv$ prima di leggere il file?

Oppure, si, puoi modificare direttamente il file CSV riga per riga.

NOTA: Bada che non sia proprio DBeaver a creare file non UTF-8...
« Ultima modifica: 24 Settembre 2019, 17:15:01 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline dregi

  • Gambero
  • **
  • Post: 85
  • Non possum tuis usque tandem abutere patientiae?
    • Mostra profilo
Re:Database: caratteri accentati
« Risposta #4 il: 28 Settembre 2019, 21:22:41 »
Dando un'occhiata al tuo provacvs. mi sono avventurato ad un inserimento nel database postgres via codice ed ho sviluppato questo che segue:
Codice: [Seleziona]
Public Sub Button1_Click()
'------------------------------->correzione file csv

Dim pFile, tmp, prima, seconda, terza As String
Dim partial As String[]
Dim Fil As File
partial = New String[]
pFile = vp.AppPath & "DB/merce.csv"
Fil = Open pFile For Read
    While Not Eof(Fil)
     
    Line Input #Fil, tmp
    If Len(tmp) > 1 Then
      partial = Split(tmp, ";")                                                       'il carattere ; suddivide i campi nel file csv
      If Len(partial[0]) > 1 Then
        prima = Conv(partial[0], "WINDOWS-1253", "UTF-8")   'corrisponde a campo NOME 
      Endif
      If Len(partial[1]) > 1 Then
        seconda = Conv(partial[1], "WINDOWS-1253", "UTF-8") '    "               CODICE   
      Endif
      If Len(partial[2]) > 1 Then
        terza = Conv(partial[2], "WINDOWS-1253", "UTF-8")   '    "               DITTA 
      Endif

      $Con.Begin
      res = $Con.Create("prova")
      If res.Available Then
        res!nome = prima
        res!codice = seconda
        res!ditta = terza
        res.Update
      Endif
      $Con.Commit
    Endif
    Wend
    Fil.Close
Catch
  $Con.Rollback
  Message.Error(Error.Text)   
End

ma ho un problema banale....beh, non tanto banale. Nel file csv le voci vengono presentate così:
"penellini per colorare"; "3MCB";"Ferrari"   e il mio problema è che, trattando queste voci come stringa, come puoi notare dal codice, mi ritrovo le virgolette anche dentro al campo Postgres.
Verrebbe spontaneo pensare ad un replace , ma non ho cavato un ragno dal buco per il fatto che stiamo parlano di virgolette e fare un Replace di 'virgolette' è veramente un problema.
Hai suggerimenti?

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.158
  • Tonno verde
    • Mostra profilo
Re:Database: caratteri accentati
« Risposta #5 il: 28 Settembre 2019, 22:40:06 »
Ci sarebbe UnQuote ma con i file non funziona, boh.

Puoi fare così:
Codice: [Seleziona]
      If res.Available Then
        res!nome = Replace(prima, "\"", "")
        res!codice = Replace(seconda, "\"", "")
        res!ditta = Replace(terza, "\"", "")
        res.Update
      Endif
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline dregi

  • Gambero
  • **
  • Post: 85
  • Non possum tuis usque tandem abutere patientiae?
    • Mostra profilo
Re:Database: caratteri accentati
« Risposta #6 il: 28 Settembre 2019, 23:14:40 »
Funzionaaa!! Fun-zio-na!! Grazie!

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.158
  • Tonno verde
    • Mostra profilo
Re:Database: caratteri accentati
« Risposta #7 il: 28 Settembre 2019, 23:29:14 »
 :)
Ho capito cosa non andava nella mia prova con UnQuote gli danno fastidio gli eventuali spazi all'inizio o in fondo.
Codice: [Seleziona]
res!nome = UnQuote(Trim(prima))
funziona.
Il vantaggio di UnQuote rispetto a Replace è che se tu hai nella stringa che passi dal file delle virgolette interne che devono rimanere UnQuote le lascia mentre Replace le toglie tutte.
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline dregi

  • Gambero
  • **
  • Post: 85
  • Non possum tuis usque tandem abutere patientiae?
    • Mostra profilo
Re:Database: caratteri accentati
« Risposta #8 il: 28 Settembre 2019, 23:50:53 »
Gianluigi, mi resta un problema, sembra che ....... "WINDOWS-1253", "UTF-8")  abbia qualche problema di conversione, infatti Gates N° 2  lo trasforma bene , ma se si tratta di vocale accentata, nel mio caso la à lo fa male: ad esempio invece di Rotolo Sterilità 75 mi dà Rotolo Sterilitΰ 75.

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.158
  • Tonno verde
    • Mostra profilo
Re:Database: caratteri accentati
« Risposta #9 il: 29 Settembre 2019, 09:14:10 »
Gianluigi, mi resta un problema, sembra che ....... "WINDOWS-1253", "UTF-8")  abbia qualche problema di conversione, infatti Gates N° 2  lo trasforma bene , ma se si tratta di vocale accentata, nel mio caso la à lo fa male: ad esempio invece di Rotolo Sterilità 75 mi dà Rotolo Sterilitΰ 75.

Dipende dal set di caratteri usato dal tuo Windows.
Nella wiki di Conv$ c'è scritto che li puoi vedere tutti digitando da terminale iconv -l
« Ultima modifica: 29 Settembre 2019, 09:14:44 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro