2011-08-03 08:39:00 +0000 2011-08-03 08:39:00 +0000
64
64

Formatage d'un CSV délimité par des virgules pour forcer Excel à interpréter la valeur comme une chaîne

J'ai cherché pendant un certain temps comment produire un fichier CSV de manière à forcer Excel à interpréter les valeurs comme une chaîne de caractères et à ne pas essayer de les convertir en chiffres ou en dates.

par exemple :

"141", "10/11/2002", "350.00", "1311742251"

Excel essaie de convertir “intelligemment” toutes ces valeurs dans leur format natif de date/nombres. Y a-t-il un moyen de contourner ce problème ?


_EDIT : J'ai clarifié l'intention de ma question, désolé pour la confusion.

Réponses (5)

70
70
70
2011-08-03 08:39:57 +0000

Pour ceux qui ont le contrôle des données sources, il semble qu'Excel détecte automatiquement le format d'un champ CSV, à moins que la colonne CSV ne soit dans ce format :

"=""Data Here"""

par exemple…

20, 5.5%, "0404 123 351", "3-6", "=""123"""
[number] [percent] [number] [date] [string] <-- how Excel interprets

Cela fonctionne également dans Google Spreadsheet, mais on ne sait pas si d'autres applications de tableur prennent en charge cette notation.

Si vous pensez que l'une des données peut contenir des guillemets, vous devez les doubler, comme ceci…

"=""She said """"Hello"""" to him"""

(EDIT : Mise à jour avec corrections, merci DMA57361 !)

39
39
39
2014-01-20 13:02:48 +0000

Comme beaucoup, je me suis battu avec les mêmes décisions que Microsoft et j'ai essayé diverses solutions proposées.

Pour Excel 2007, voici ce qui se passe :

  • Mettre toutes les valeurs entre guillemets n'aide PAS
  • Mettre un = avant toutes les valeurs après les avoir mises entre guillemets aide, MAIS rend le fichier csv inutile pour la plupart des autres applications
  • Mettre des parenthèses autour des guillemets autour de toutes les valeurs est de la foutaise
  • Mettre un espace avant toutes les valeurs avant de les mettre entre guillemets empêche les conversions en dates, mais N'empêche PAS de couper les zéros de tête ou de queue.
  • Mettre un simple guillemet devant une valeur ne fonctionne que lors de la saisie de données dans Excel.

Cependant :

Mettre une tabulation devant toutes les valeurs avant de les entourer de guillemets doubles empêche les conversions en dates ET empêche le découpage des zéros de tête ou de queue et la feuille n'affiche même pas de méchants marqueurs d'avertissement dans le coin supérieur gauche de chaque cellule.

Par exemple

"<tab character><some value>","<tab character><some other value>"

Notez que le caractère de tabulation doit se trouver entre les guillemets. Modifier : il s'avère que les doubles guillemets ne sont même pas nécessaires.

Un double clic sur le fichier csv peut ouvrir le fichier comme une feuille de calcul dans Excel montrant toutes les valeurs qui sont traitées comme juste au-dessus, comme des données textuelles. Assurez-vous de configurer Excel pour utiliser le ‘.’ comme point décimal et non le ‘, ’ ou chaque ligne du fichier csv se retrouvera comme un texte dans la première cellule de chaque ligne. Apparemment, Microsoft pense que CSV signifie “Not the decimal point” Separated Value.

22
22
22
2011-08-03 09:13:56 +0000

L'utilisation de la fonctionnalité d'importation d'Excel vous permet de spécifier le format (automatique, texte ou date) ; chaque colonne doit être interprétée comme et ne nécessite aucune modification des fichiers de données.

Vous pouvez le trouver comme DataGet External DataFrom Text dans Excel 2007/2010.
ou DataImport External DataImport Data en Excel 2003.

Voici une image de l'assistant d'importation de texte d'Excel 2003 en action sur les données d'exemple données, me montrant l'importation des deux dernières colonnes sous forme de texte :

2
2
2
2013-01-13 22:37:27 +0000

L'exemple de Simon n'a pas fonctionné pour moi, et je soupçonne qu'il s'agit d'une différence de langue. En C#, voici à quoi ressemble ma chaîne de format de travail :

var linebreak = (i++ == list.Count) ? "" : "\r\n";

csv += String.Format("=\"{0}\",{1},{2},{3},=\"{4}\"{5}",
    item.Value, item.Status, item.NewStatus, item.Carrier, c.Status, linebreak);

et voici à quoi ressemble le fichier de sortie :

="abababababab",INVALID,INVALID,USPS,="",
="9500100030492359000149",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9500100030492359000149",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9500100030492359000149",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9500100030492359000149",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9400110200793482982812",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9400110200793482982812",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9400110200793000216184",UNKNOWNSTATUS,INVALID,USPS,=""

Comme on peut le voir, le format du fichier de sortie est ="VALUE", et non "=""VALUE""", ce qui, je crois, est peut-être une convention Visual Basic.

J'utilise Excel 2010. Soit dit en passant, Google Sheets n'ouvrira pas/convertit un fichier formaté de cette façon. Cela fonctionnera si vous supprimez le signe égal donc "VALUE", - Excel ouvrira toujours le fichier mais ignorera le fait que vous voulez que vos colonnes soient des chaînes de caractères.

-2
-2
-2
2013-01-13 23:23:56 +0000

Un moyen simple de forcer Excel à interpréter la date comme un texte est de mettre une seule citation devant la date, au lieu d'utiliser des citations complètes, comme dans

‘10/11/2002

Si vous pouvez importer le CSV au lieu de l'ouvrir, vous pouvez indiquer à Excel le format que doit avoir chaque colonne. Regardez cette question que j'ai posée .