Chaque fois que je lis un fichier csv
dans R (read.csv("file_name.csv")
) qui a été exporté à l'aide de crapaud, le premier nom de colonne est précédé des caractères suivants "je..". De plus, l'ouverture du fichier csv dans Excel ou notepad ++ s'affiche correctement (sans les caractères précédents). C'est un problème car ma solution de contournement a été de renommer la colonne après chaque lecture. Merci pour toute correction de ce problème!
Éditer:
L'exportation a été créée dans Toad en cliquant avec le bouton droit sur le jeu de résultats d'une requête et en sélectionnant
'Exportation rapide -> Fichier -> Fichier CSV'
Plus de détails par commentaire:head(readLines('test_file.csv'),n=3)
[1] "ID,LOCATION" "12021,1204" "12281,1204"
Essaye ça:
d <- read.csv("test_file.csv", fileEncoding="UTF-8-BOM")
Cela fonctionne dans R 3.0.0+ et supprime la nomenclature si elle est présente dans le fichier (commun pour les fichiers générés à partir d'applications Microsoft: Excel, SQL server)
Je sais que c'est une très vieille question, mais la solution la plus simple que j'ai trouvée est d'utiliser NotePad ++. Ouvrez le fichier CSV dans NotePad ++, cliquez sur "Encodage" et sélectionnez "Encoder en UTF-8" et enregistrez le fichier. Il supprime la nomenclature et le code d'origine devrait fonctionner.
Avec le contenu multilingue de plus en plus utilisé pour la science des données, il n'y a tout simplement plus de moyen sûr de supposer utf-8 plus longtemps (dans mon cas, Excel supposait UTF-16 parce que la plupart de mes données incluaient le chinois traditionnel (mandarin?).
Selon Microsoft Docs , les nomenclatures suivantes sont utilisées dans Windows:
|----------------------|-------------|-----------------------|
| Encoding | Bom | Python encoding kwarg |
|----------------------|-------------|-----------------------|
| UTF-8 | EF BB BF | 'utf-8' |
| UTF-16 big-endian | FE FF | 'utf-16-be' |
| UTF-16 little-endian | FF FE | 'utf-16-le' |
| UTF-32 big-endian | 00 00 FE FF | 'utf-32-be' |
| UTF-32 little-endian | FF FE 00 00 | 'utf-32-le' |
|----------------------|-------------|-----------------------|
J'ai trouvé l'approche suivante qui semble bien fonctionner pour détecter l'encodage à l'aide de la marque d'ordre des octets au début du fichier:
def guess_encoding_from_bom(filename, default='utf-8'):
msboms = dict((bom['sig'], bom) for bom in (
{'name': 'UTF-8', 'sig': b'\xEF\xBB\xBF', 'encoding': 'utf-8'},
{'name': 'UTF-16 big-endian', 'sig': b'\xFE\xFF', 'encoding':
'utf-16-be'},
{'name': 'UTF-16 little-endian', 'sig': b'\xFF\xFE', 'encoding':
'utf-16-le'},
{'name': 'UTF-32 big-endian', 'sig': b'\x00\x00\xFE\xFF', 'encoding':
'utf-32-be'},
{'name': 'UTF-32 little-endian', 'sig': b'\xFF\xFE\x00\x00',
'encoding': 'utf-32-le'}))
with open(filename, 'rb') as f:
sig = f.read(4)
for sl in range(3, 0, -1):
if sig[0:sl] in msboms:
return msboms[sig[0:sl]]['encoding']
return default
# Example using python csv module
def excelcsvreader(path, delimiter=',',
doublequote=False, quotechar='"', dialect='Excel',
escapechar='\\', fileEncoding='UTF-8'):
filepath = os.path.expanduser(path)
fileEncoding = guess_encoding_from_bom(filepath, default=fileEncoding)
if os.path.exists(filepath):
# ok let's open it and parse the data
with open(filepath, 'r', encoding=fileEncoding) as csvfile:
csvreader = csv.DictReader(csvfile, delimiter=delimiter,
doublequote=doublequote, quotechar=quotechar, dialect=dialect,
escapechar='\\')
for (rnum, row) in enumerate(csvreader):
yield (rnum, row)
Je me rends compte que cela nécessite d'ouvrir le fichier pour la lecture deux fois (une fois binaire et une fois sous forme de texte codé) mais l'API ne facilite pas vraiment la procédure autrement dans ce cas particulier.
En tout cas, je pense que c'est un peu plus robuste que de simplement supposer utf-8 et évidemment la détection automatique de l'encodage ne fonctionne pas donc ...
Après une recherche plus approfondie, cela concerne les caractères ajoutés à la nomenclature (Byte Order Mark). Apparemment, vous ne pouvez pas utiliser l'exportation rapide, mais l'exportation de données Wizard à la place car elle permet de définir l'encodage du fichier. Cela a fonctionné pour moi en le définissant sur l'Europe occidentale (Windows) au lieu d'unicode utf-8.