4 votes

Comment sauvegarder les guillemets doubles et le point-virgule dans un fichier CSV tout en ouvrant le fichier dans Excel 2010 ?

Je reçois un fichier CSV du serveur. Les données à l'intérieur sont délimitées par un point-virgule et sont au format UTF-8. Par exemple, les données que nous recevons sont :

 "NL "" mutilple"""

Quand nous l'ouvrons pour la première fois dans Excel 2010, cela s'affiche comme

NL " mutilple"

Mais quand je modifie (j'ai juste enlevé la lettre L du texte ci-dessus) ce fichier et l'enregistre en tant que CSV en utilisant Excel et l'ouvre pour la deuxième fois, cela ressemblera à

N inbetween (sans guillemets)

Je veux que les données après la modification soient enregistrées avec des guillemets.

Merci

2voto

Ross Points 1245

J'ai essayé cela en utilisant Excel 2016

J'ai ouvert Excel - Sélectionner Fichier, ouvrir le fichier "CSV" et sélectionner délimité, point-virgule comme séparateur et "comme délimiteur de texte.

Cela a ensuite été importé comme prévu et j'ai pu modifier la cellule et supprimer le L comme vous l'avez demandé à l'origine

Le clic sur ENREGISTRER corrompt effectivement le fichier comme vous l'avez constaté et expliqué dans d'autres réponses.

Cependant, choisissez ENREGISTRER SOUS et sélectionnez UNICODE comme dans l'un des commentaires - le fichier a été enregistré UTF-8 en tant que fichier séparé par des tabulations avec "comme délimiteur de texte. Avez-vous essayé cela? Est-ce inacceptable?

Si je sélectionnais ENREGISTRER SOUS et que je choisissais UTF-8 séparé par virgules alors il était enregistré en UTF-8 séparé par des virgules - Je ne pouvais pas voir de méthode pour conserver le point-virgule en tant que séparateur. Cependant, vous devriez passer en revue les options ENREGISTRER SOUS et voir si l'un des formats disponibles dans votre version d'Excel est acceptable.

S'il est nécessaire de conserver le point-virgule, vous pourriez post-traiter le fichier enregistré avec un script de remplacement de texte qui comprend la notion de citation (de sorte que, à l'intérieur des guillemets ne soit pas remplacé) Un script VBScript ou Powershell pourrait être écrit pour cela, alternativement un macro VBA pour concaténer toutes les cellules en une seule avec des virgules les séparant pourrait être utilisé.

Une commande Powershell unique dépendante pour faire cette conversion finale serait (Exécutée à partir d'une invite de commande)

powershell -command "& import-csv 'CSVUTF.CSV'| export-csv 'PSCSVUTF.CSV' -Encoding 'UTF8' -Delimiter ';' -notype"

Si votre fichier n'a pas de ligne d'en-tête avec des noms de colonnes, un paramètre -header devra être fourni et le fichier de sortie se retrouvera avec une ligne d'en-tête

1voto

gns100 Points 740

Il semble que cela ait été répondu il y a des années sur StackOverflow : https://stackoverflow.com/questions/4221176/excel-to-csv-with-utf8-encoding

Fondamentalement, Excel enregistre les fichiers CSV uniquement en encodage ASCII. La solution de contournement est d'utiliser OpenOffice, Google Docs ou de sauvegarder en tant que texte encodé en UTF8. Pas sûr de comment cela affectera les autres processus que vous utilisez avec le fichier manipulé après cela.

0voto

NJMR Points 147

J'ai écrit une macro VBA et la logique est :

  1. Si le cellule de données contient des guillemets, alors duplicer les guillemets.
  2. Si le cellule de données contient une virgule ou des guillemets, alors envelopper toute la donnée avec des guillemets.

Exemple :

  • Étape 1 : NL " mutilple" devient NL "" mutilple""
  • Étape 2 : Après l'étape 2, les données deviennent "NL "" mutilple"""

Ce code correspond à la description ci-dessus

tempString = Sheets(1).Cells(lRow, lCol).Text                   ' Récupérer les données de la cellule.
tempString = Replace(tempString, Chr(34), Chr(34) & Chr(34))    ' S'il y a des guillemets, les dupliquer.
CurrTextStr = tempString
pos1 = InStr(tempString, Chr(34))                               ' Obtenir la position des guillemets. Si non présent, elle sera 0.
pos2 = InStr(tempString, ";")                                   ' Obtenir la position du point-virgule. Si non présent, elle sera 0.
If (pos1 <> 0 Or pos2 <> 0) Then                                ' S'il y a un guillemet ou un point-virgule, alors toute la donnée
    CurrTextStr = Chr(34) & tempString & Chr(34)                '       doit être enveloppée avec des guillemets.
End If
oAdoS.WriteText (";" & CurrTextStr)

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X