web-dev-qa-db-fra.com

Mise en forme d'un fichier CSV délimité par des virgules pour obliger Excel à interpréter la valeur en tant que chaîne

Je cherche depuis un moment à trouver comment sortir un fichier CSV de manière à forcer Excel à interpréter les valeurs sous forme de chaîne et à ne pas essayer de les convertir en chiffres ou en dates.

par exemple.:

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

Excel tente de convertir "intelligemment" tous ceux-ci dans ses formats de date/nombre natifs. Y a-t-il un moyen de contourner cela?


EDIT: Clarifié l'intention de ma question, désolé pour la confusion.

54
Simon East

Pour ceux qui ont le contrôle sur les données source, apparemment, Excel détectera 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 ne sait pas si d'autres applications de tableur prennent en charge cette notation.

Si vous pensez que des données peuvent contenir des guillemets, vous devez double-escape them, comme ceci ...

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



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

57
Simon East

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

Pour Excel 2007, ce qui suit va:

  • Mettre toutes les valeurs entre guillemets n'aide en rien
  • Mettre un = avant toutes les valeurs après les avoir mises en double couche 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 une foutaise
  • Mettre un espace avant toutes les valeurs avant de mettre les guillemets doubles autour d'eux empêche la conversion en dates, mais n'empêche pas la réduction des zéros au début ou à la fin.
  • Mettre un guillemet simple devant une valeur ne fonctionne que lors de la saisie de données dans Excel.

Toutefois:

Le fait de placer un onglet avant toutes les valeurs avant de mettre les guillemets doubles empêche les conversions en dates ET empêche la suppression des zéros au début ou à la fin et la feuille ne montre même pas de mauvais indicateurs 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 figurer entre les guillemets. Edit: il s’avère que les guillemets ne sont même pas nécessaires.

Un double clic sur le fichier csv peut ouvrir le fichier en tant que feuille de calcul dans Excel affichant toutes les valeurs traitées comme ci-dessus, comme les données de texte. Assurez-vous de configurer Excel pour utiliser le '.' en tant que point décimal et non le ',' ou chaque ligne du fichier csv se terminera par un texte dans la première cellule de chaque ligne. Apparemment, Microsoft pense que CSV signifie "pas le point décimal", valeur séparée.

32
ajabo

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

Vous pouvez le trouver sous la forme DataGet External DataFrom Text dans Excel 2007/2010.
Ou DataImport External DataImport Data dans Excel 2003.

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

Excel 2003: Text Import Wizard on Step 3 - data types

20
DMA57361

L'exemple de Simon n'a pas fonctionné pour moi et je suppose que c'est 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 constater, le format du fichier de sortie est ="VALUE", et non "=""VALUE""",, ce qui, à mon avis, pourrait être une convention Visual Basic.

J'utilise Excel 2010. Incidemment, Google Sheets n'ouvrira/convertira pas un fichier formaté de cette manière. Cela fonctionnera si vous supprimez le signe égal ainsi "VALUE", - Excel ouvrira toujours le fichier mais ignorera le fait que vous voulez que vos colonnes soient des chaînes.

1
Shane