Caractères spéciaux et encodage
RE à tous
Comme je l'ai signalé le Csv est codé en UTF8 : j'ai donc modifié le PowerQuery de Jean-Eric, ajouté ' et É, et la conversion de Company pendant que Jean-Eric faisait la même chose à part l'UTF8
On voit notamment la différence sur la colonne Seq Name
Pour ce qui est de la liste des 171 caractères latins diacritiques que j'avais recensés à une certaine époque (attention il n'y a pas les signes apostrophes et guillemets).
Je ne peux pas le mettre dans le corps du message car le forum me répond
Erreur : le champ "Message" contient des caractères non valides.
C'est peut-être un peu riche, mais avec une routine dichotomique on trouve vite la solution.
Pour le reste, je renvoie aux spécialistes de PowerQuery ...
Sans remettre en cause les solutions d'avenir PowerQuery qui me sont encore un peu étrangères, et pour contribuer à enrichir, voire répondre aux personnes qui ne pourraient charger PowerQ (interdiction employeur par ex.), voici une solution plus conventionnelle qui m'a permis de décrasser mes neurones engourdis.
Comme dit précédemment, il est impératif de traiter le problème en amont pour avoir un fichier propre et sans douté d'éviter des interventions qui pourraient le dénaturer. Quand c'est le bazar en amont (je suis poli), c'est le bazar en aval.
Il faut donc juste considérer cette proposition comme une illustration de
- expressions régulières
- dichotomie
Sub lire()
Dim dico As Object, txt As String
Set dico = CreateObject("Scripting.Dictionary")
Set obj = CreateObject("vbscript.regexp")
obj.Pattern = "u[0-9a-fA-F]{4}"
obj.Global = True
Fichier = Application.GetOpenFilename("Fichiers texte, *.csv;*.txt")
If Fichier = False Then Exit Sub
On Error Resume Next
dia = [Tdia].Value
Sheets("csv").Select
Cells.Clear
li = 1
N = FreeFile
Open Fichier For Input As #N
Do While Not EOF(1)
Line Input #N, Contenu
Set res = obj.Execute(Contenu)
For i = 0 To res.Count - 1
txt = UCase(res(i))
Contenu = Replace(Contenu, res(i), dia(dichotomie(txt, dia), 2))
Next
tbl = Split(Contenu, ",")
Cells(li, 1).Resize(1, UBound(tbl)) = tbl
li = li + 1
Loop
Close #N
End Sub
Function dichotomie(valeurcherchee As Variant, tableau) As Double
' donne la ligne de la valeur recherchée (0 si pas trouvé)
Dim deb As Double, fin As Double, milieu As Double
Dim valeurcourante As Variant
dichotomie = 0
deb = LBound(tableau)
fin = UBound(tableau)
If valeurcherchee = tableau(deb, 1) Then dichotomie = deb: Exit Function
If valeurcherchee = tableau(fin, 1) Then dichotomie = fin: Exit Function
While deb <> fin - 1
milieu = Int((deb + fin) / 2)
valeurcourante = tableau(milieu, 1)
If valeurcourante = valeurcherchee Then
dichotomie = milieu
Exit Function
Else
If valeurcourante > valeurcherchee Then
fin = milieu
Else
deb = milieu
End If
End If
Wend
End Function
Bonjour,
J'ai continué malgré le fait que Alban10 travaille sous Mac (Power Query non disponible).
@Steelson,
L'objet Dictionary n'est pas disponible sous Mac (!?).
Bon pour résumer, le csv importé en UTF-8 (65001), une table de conversion élargie et une fonction personnalisée.
En cas d'ajout de symboles, consulter le lien fourni dans le fichier joint.
Cdlt.
@Steelson,
L'objet Dictionary n'est pas disponible sous Mac (!?).
ok
En fait je n'utilise pas dictionary, les deux premières lignes peuvent être enlevées, c'est le reliquat du programme précédent
J'utilise par contre les expressions régulières ... qui n'existent pas non plus sur mac.
Ma solution serait alors de balayer chaque ligne et de tester chaque groupe de 5 caratères commençant par u, mais ce n'est plus très rigolo ! et j'ai le sentiment qu'on a perdu alban10
@Jean-Eric ... je n'ai pas vu comment tu faisais ta
fonction personnalisée
?