Empêcher Excel de convertir automatiquement certaines valeurs de texte en dates


526

Est-ce que quelqu'un sait s'il y a un jeton que je peux ajouter à mon csv pour un certain champ afin qu'Excel n'essaye pas de le convertir en une date?

J'essaie d'écrire un fichier .csv à partir de mon application et l'une des valeurs ressemble suffisamment à une date pour qu'Excel le convertisse automatiquement du texte en date. J'ai essayé de mettre tous mes champs de texte (y compris celui qui ressemble à une date) entre guillemets doubles, mais cela n'a aucun effet.


120
Oui, comme lorsqu'un fichier avec 10000 noms d'utilisateur en a un tel que "avril25", qui est converti en date, et est finalement traité comme "25 avril", ce qui entraîne une erreur "nom d'utilisateur introuvable", car vous ne l'avez pas attendez-vous à ce qu'Excel convertisse une seule valeur en une date, 4000 enregistrements dans le fichier, tout en laissant le reste du texte. Quel code de lecture CSV boiteux; vraiment, n'est-il pas censé deviner le type basé sur les premiers enregistrements X et s'y tenir? Ou laissez tout le texte. Si je veux le mettre en forme de "général", je pourrai le choisir plus tard. En supposant "général" dès le départ, il risque de corrompre les données textuelles.
Triynko

J'ai eu le problème lors du copier-coller. Pour toutes les recherches dans la solution, sélectionnez la colonne cible, définissez-la sur un format chaîne / texte, puis copiez la source et faites un collage spécial (clic droit) avec 'valeurs uniquement'. Préserve les valeurs, pas de formatage de date.
Kai Noack du

84
Je veux juste ajouter que je considère ce comportement d'Excel comme un grave défaut. Qu'en est-il de toutes les personnes qui n'ont pas le luxe de modifier le contenu du fichier csv avant d'importer vers Excel? Ou qu'en est-il des personnes qui ne réalisent ce problème qu'après avoir apporté de nombreuses autres modifications au fichier CSV? Cela rend le travail avec les fichiers CSV dans Excel un gâchis.
robguinness

Utilisez-vous DatatableJS? Parce que je sais déjà comment faire cela avec cette API. Si vous en avez besoin, vous pouvez le trouver ici: stackoverflow.com/a/36142043/4241058
Richard Rebeco

11
Toutes ces solutions pour utiliser Fichier -> Ouvrir -> Importer fonctionnent bien pour nous parce que nous savons ce que nous faisons, mais cela est inutile pour les autres 99,5% du monde qui ne comprennent pas la navigation dans le système de fichiers de / à l'intérieur / d'un application. Ils voient un fichier, pour l'utiliser, ils double-cliquent dessus. J'ai passé 25 ans à enseigner aux gens comment utiliser les applications bureautiques et à écrire du code qui génère des données pour lesdites applications bureautiques, et utiliser / application / pour rechercher le fichier à utiliser est complètement au-delà de presque tout le monde.
user2624417

Réponses:


355

J'ai trouvé que mettre un «=» avant les guillemets doubles accomplira ce que vous voulez. Il force les données à être du texte.

par exemple. = "2008-10-03", = "plus de texte"

EDIT (selon d'autres articles) : en raison du bogue Excel 2007 noté par Jeffiekins, on devrait utiliser la solution proposée par Andrew :"=""2008-10-03"""


12
J'accepte cette réponse car 1) mon fichier csv ne sera utilisé que par Excel, et 2) c'est pour la comptabilité et ne peut pas avoir de 'au début, et 3) je ne veux pas qu'ils aient à faire une importation. Je veux juste qu'ils ouvrent le csv.

5
Génial! Mais à cause du bug Excel 2007 utiliser la solution proposée par Andrew : "=""2008-10-03""". Mis à jour le message.
TMS

1
Cela ne fonctionne pas pour moi dans Excel 2010 si le texte est trop long :(
steve

7
La raison pour laquelle cela fonctionne est que lorsque Excel voit le caractère "=", il décide d'évaluer l'expression qui le suit. Dans ce cas, l'expression est simplement un littéral de chaîne et la valeur d'un littéral de chaîne est le contenu de la chaîne. Ainsi, les guillemets disparaissent comme par magie. Vous pouvez mettre = 1 + 2 + 3 et obtenir la valeur 6 après l'importation CSV. La formule elle-même n'est pas détruite lors du processus d'importation.
lokori

4
Il y a un gros problème avec cette approche - si vous ouvrez le fichier dans Excel et éditez puis enregistrez et ouvrez à nouveau tous ces "disparaissent
ACV

150

Je sais que c'est une vieille question, mais le problème ne disparaîtra pas de sitôt. Les fichiers CSV sont faciles à générer à partir de la plupart des langages de programmation, plutôt petits, lisibles par l'homme avec un éditeur de texte brut et omniprésents.

Le problème n'est pas seulement avec les dates dans les champs de texte, mais tout ce qui est numérique est également converti du texte en nombres. Quelques exemples où cela pose problème:

  • ZIP / codes postaux
  • numéros de téléphone
  • numéros d'identification du gouvernement

qui peut parfois commencer par un ou plusieurs zéros (0), qui sont jetés lors de la conversion en numérique. Ou la valeur contient des caractères qui peuvent être confondus avec des opérateurs mathématiques (comme dans les dates: /, -).

Deux cas auxquels je peux penser que la solution "prepending =", comme mentionné précédemment, pourrait ne pas être idéal est

  • où le fichier peut être importé dans un programme autre que MS Excel (la fonction de fusion et publipostage de MS Word vient à l'esprit),
  • où la lisibilité humaine peut être importante.

Mon hack pour contourner cela

Si l'on pré / ajoute un caractère non numérique et / ou non date dans la valeur, la valeur sera reconnue comme texte et non convertie. Un caractère non imprimable serait bien car il ne modifiera pas la valeur affichée. Cependant, l'ancien caractère d'espace simple (\ s, ASCII 32) ne fonctionne pas pour cela car il est coupé par Excel, puis la valeur est toujours convertie. Mais il existe divers autres caractères d'espace d'impression et de non-impression qui fonctionneront bien. Le plus simple est cependant d' ajouter (ajouter après) le caractère de tabulation simple (\ t, ASCII 9).

Avantages de cette approche:

  • Disponible au clavier ou avec un code ASCII facile à retenir (9),
  • Cela ne dérange pas l'importation,
  • Normalement, ne dérange pas les résultats de la fusion et du publipostage (selon la disposition du modèle - mais normalement, cela ajoute simplement un grand espace à la fin d'une ligne). (Si c'est cependant un problème, regardez d'autres caractères, par exemple l'espace de largeur nulle (ZWSP, Unicode U + 200B)
  • n'est pas un gros obstacle lors de la visualisation du CSV dans le Bloc-notes (etc.),
  • et pourrait être supprimé par trouver / remplacer dans Excel (ou Bloc-notes, etc.).
  • Vous n'avez pas besoin d' importer le CSV, mais vous pouvez simplement double-cliquer pour ouvrir le CSV dans Excel.

S'il y a une raison pour laquelle vous ne souhaitez pas utiliser l'onglet, recherchez dans une table Unicode autre chose appropriée.

Une autre option

pourrait être de générer des fichiers XML, pour lesquels un certain format est également accepté pour l'importation par les nouvelles versions de MS Excel, et qui permet beaucoup plus d'options similaires au format .XLS, mais je n'ai pas d'expérience avec cela.

Il existe donc différentes options. Selon vos besoins / application, l'un peut être meilleur qu'un autre.


Une addition

Il faut dire que les nouvelles versions (2013+) de MS Excel n'ouvrent plus le CSV au format tableur - un ralentissement de plus dans son flux de travail rendant Excel moins utile ... Au moins, des instructions existent pour le contourner. Voir par exemple ce Stackoverflow: comment afficher correctement les fichiers .csv dans Excel 2013? .


6
J'ai obtenu des zéros de tête corrects après avoir ajouté \tà mon caractère de séparation ;... bon sang MS Office, pourquoi cela m'a-t-il fallu plus de 2 minutes pour comprendre?
Morten Jensen

2
Ajouter \ t à la fin de toutes les valeurs fait en effet l'affaire. C'est une solution de contournement hacky, mais en pratique, cela fonctionne bien. Je préfère cela à l'astuce de formule avec le '=' égal, car le premier pourrait être difficile à travailler avec d'autres outils.
ocroquette

3
Il n'y a pas assez de votes positifs pour exprimer ma gratitude envers vous. La recherche et le remplacement dans notepad ++ ',' to '\ t, \ t' (pour tenir compte des première et dernière colonnes également) fonctionnent comme un charme. Merci.
Asaf

1
Dans ma requête MySQL (pour la sortie CSV via PHP), j'ai utilisé CONCAT ('\ t', column_name). A également fait l'affaire. Merci!
Just Plain High

1
Bonne idée. Hélas, Numbers est un peu plus "intelligent" qu'Excel et ne tombe pas dans le piège de la tabulation. La meilleure alternative que je peux trouver est un leader ', car c'est un peu bien compris et pas trop distrayant ... mais un invisible serait mieux.
Heath Raftery

101

En travaillant sur la solution de Jarod et le problème soulevé par Jeffiekins, vous pouvez modifier

"May 16, 2011"

à

"=""May 16, 2011"""

6
Ne fonctionne pas dans Excel 2010 si le texte est plus long qu'une certaine longueur.
steve

1
@Andrew, ce "correctif" causera des problèmes si vous avez besoin d'avoir des "valeurs n'importe où entre la date.
Pacerier

8
Pour info, si vous enregistrez le fichier Excel, le = disparaît et vous revenez à la case départ la prochaine fois que vous
ouvrirez

Mon expérience ne correspond ni à Steve ni à D512. Cela fonctionne pour moi dans le .csv entrant dans Excel 2013, et après l'enregistrement au format .xlsx, il ne revient pas. Assez facile pour que quiconque puisse tester en utilisant cette ligne de données: "806676", "Aucune", "41", "=" "16 mai 2011" "", "100,00", "Faux"
tbc0

1
@ tbc0 Essayez à la "806676","None","41","=""05-16-2011""","100.00","False"place et vous verrez une sauvegarde et un rechargement perd le texte coupé.
NetMage

65

J'ai eu un problème similaire et c'est la solution de contournement qui m'a aidé sans avoir à modifier le contenu du fichier csv:

Si vous avez la possibilité de nommer le fichier autrement que ".csv", vous pouvez le nommer avec une extension ".txt", comme "Myfile.txt" ou "Myfile.csv.txt". Ensuite, lorsque vous l'ouvrez dans Excel (pas par glisser-déposer, mais en utilisant Fichier-> Ouvrir ou la liste des fichiers les plus récemment utilisés), Excel vous fournira un "Assistant d'importation de texte".

Dans la première page de l'assistant, choisissez "Délimité" pour le type de fichier.

Dans la deuxième page de l'assistant, choisissez "," comme délimiteur et choisissez également le qualificatif de texte si vous avez entouré vos valeurs de guillemets

Dans la troisième page, sélectionnez chaque colonne individuellement et attribuez à chacun le type "Texte" au lieu de "Général" pour empêcher Excel de jouer avec vos données.

J'espère que cela vous aidera, vous ou quelqu'un avec un problème similaire!


2
Oh, d'ailleurs je ne suis pas le premier à découvrir ça. isingline.com/use-excel-read-csv-without-reformatting.php Cette page Web contient également des instructions utiles vous permettant de cliquer sur les colonnes de la troisième page de l'assistant pour les sélectionner toutes ensemble avant d'attribuer à chacune le type "Texte".
rainerbit

Cela peut fonctionner pour les valeurs de date, mais cela ne semble pas fonctionner pour les choses qu'Excel interprète comme numériques. Si votre chaîne est entièrement composée de chiffres et de virgules, le format "Texte" sera un format numérique scientifique.
Michael - Où est Clay Shirky

3
cela a parfaitement fonctionné pour moi et n'a entraîné aucune modification de mon fichier, sauf pour le renommer en .txt. Merci.
Kevin

1
Malheureusement, Excel ne vous permet de le faire que pour les 6 premières colonnes. Si vous avez besoin de plus, une meilleure approche consiste à copier le contenu du fichier csv, à créer et à vider le fichier Excel, à sélectionner toutes les colonnes / lignes et à définir le type sur Texte, puis à coller le contenu et à utiliser Données | Texte vers les colonnes
nachocab

C'est la meilleure solution et doit être marquée comme réponse.
Rob

28

AVERTISSEMENT: Excel '07 (au moins) a un bogue (autre): s'il y a une virgule dans le contenu d'un champ, il n'analyse pas correctement le = "champ, contenu", mais place plutôt tout après la virgule dans le champ suivant, quels que soient les guillemets.

La seule solution de contournement que j'ai trouvée qui fonctionne est d'éliminer le = lorsque le contenu du champ comprend une virgule.

Cela peut signifier qu'il y a certains champs qui sont impossibles à représenter exactement "à droite" dans Excel, mais à ce jour, j'espère que personne n'est trop surpris.


Je viens de le tester dans Excel 2007, et cela fonctionne correctement pour moi. Cependant, s'il y a un espace avant les guillemets, il n'analyse pas correctement la virgule.
Sunny88

8
Cela ne semble pas être un bogue selon la RFC 4180. La bonne façon de citer le champ est de citer tout le champ, puis de citer deux fois les guillemets internes. Donc "=" "champ, contenu" "" tools.ietf.org/html/rfc4180
Peter Stephens

2
@PeterStephens, cela ne fonctionne pas s'il y en field, contenta ". Par exemple"=""field, co""ntent"""
Pacerier

1
@Pacerier Il est probable que la citation incorporée doive être mise entre guillemets, pour devenir """".
ErikE

Je peux confirmer que la suggestion de @ ErikE est correcte. Pour un champ avec une valeur 1"2, si vous choisissez d'utiliser cette astuce (au lieu de simplement la laisser comme "1""2"dans le fichier - Excel aurait déjà été traité comme du texte), la dernière chaîne correcte dans le fichier CSV de ciblage Excel finit être "=""1""""2""".
Tao

22

Lors de la création de la chaîne à écrire dans mon fichier CSV en C #, j'ai dû la formater de cette façon:

"=\"" + myVariable + "\""

2
cela m'a aussi réveillé dans Rails. Merci
Vieenay Siingh

3
Fonctionne également sur Java
Shoyo

A travaillé pour moi en JavaScript en utilisant Papa Parse.
wobsoriano

17

2018

La seule bonne solution qui a fonctionné pour moi (et aussi sans modifier le CSV ).

Excel 2010:

  1. Créer un nouveau classeur
  2. Données> À partir du texte> Sélectionnez votre fichier CSV
  3. Dans la fenêtre contextuelle, choisissez le bouton radio "Délimité", puis cliquez sur "Suivant>"
  4. Cases à cocher Délimiteurs: cochez uniquement "Virgule" et décochez les autres options, puis cliquez sur "Suivant>"
  5. Dans "Aperçu des données", faites défiler vers la droite, puis maintenez la touche Maj enfoncée et cliquez sur la dernière colonne (cela sélectionnera toutes les colonnes). Maintenant, dans le "Format des données de colonne", sélectionnez le bouton radio "Texte", puis cliquez sur "Terminer".

Excel office365: (version client)

  1. Créer un nouveau classeur
  2. Données> À partir du texte / CSV> Sélectionnez votre fichier CSV
  3. Détection du type de données> ne pas détecter

Remarque: Excel office365 (version Web), au moment où j'écris ceci, vous ne pourrez pas le faire.


3
Cela fonctionne sans changer les fichiers CSV au préalable, donc je pense que cela devrait être la bonne réponse.
Jack

Cela ressemble à la bonne réponse. J'avais de grands espoirs. Mais sur MacOS (office365), je ne peux pas sélectionner TOUTES les colonnes: il n'y a pas de défilement horizontal dans la fenêtre d'aperçu affichée dans l'assistant d'importation de texte, de sorte que je ne peux sélectionner que les colonnes visibles. J'ai essayé des raccourcis (CMD + A, ou autres), en vain. L'option "ne pas détecter" n'existe pas non plus. Je suis dévasté.
normanius

Excel Office 365, sélectionnez Fichier, Options, Données. Il existe des cases à cocher pour afficher les assistants d'importation de données hérités si nécessaire.
Kurt Schultz

15

Dans Excel 2010, ouvrez une nouvelle feuille. Dans le ruban Données, cliquez sur "Extraire les données externes du texte". Sélectionnez votre fichier CSV puis cliquez sur "Ouvrir". Cliquez sur Suivant". Décochez "Tab", cochez la case à côté de "Virgule", puis cliquez sur "Suivant". Cliquez n'importe où sur la première colonne. Tout en maintenant la touche Maj enfoncée, faites glisser le curseur jusqu'à ce que vous puissiez cliquer dans la dernière colonne, puis relâchez la touche Maj. Cliquez sur le bouton radio "texte" puis cliquez sur "Terminer"

Toutes les colonnes seront importées sous forme de texte, tout comme elles l'étaient dans le fichier CSV.


1
J'ai rencontré un même problème, mais suivre attentivement les instructions de @ Rob fonctionnerait parfaitement!. Merci
Milacay

2
L'assistant Data From Text ne prend malheureusement pas en charge les cellules multilignes. Si un tel texte sur plusieurs lignes est rencontré, il écrira toutes les lignes après la première dans de nouvelles lignes, interrompant l'importation entière. Il n'interprète les sauts de ligne correctement que si vous ouvrez le fichier CSV en double-cliquant. Damn you Microsoft ...
CodeManX

1
Malheureusement, cela ne résout pas le problème de "l'aide" de mise en forme aléatoire d'Excel - le texte DEC1 est toujours modifié à la date Dec-01. Idem avec le texte de AAAA-MM-JJ basculé sur JJ / MM / AAAA. :(
Baracus

12

Toujours un problème dans la version Microsoft Office 2016, plutôt dérangeant pour ceux d'entre nous qui travaillent avec des noms de gènes tels que MARC1, MARCH1, SEPT1 etc. La solution que j'ai trouvée la plus pratique après avoir généré un fichier ".csv" dans R, qui sera ensuite ouvert / partagé avec les utilisateurs d'Excel:

  1. Ouvrez le fichier CSV sous forme de texte (bloc-notes)
  2. Copiez-le (ctrl + a, ctrl + c).
  3. Collez-le dans une nouvelle feuille Excel - tout sera collé dans une colonne sous forme de longues chaînes de texte.
  4. Choisissez / sélectionnez cette colonne.
  5. Allez dans Données - "Texte aux colonnes ...", dans la fenêtre ouverte choisissez "délimité" (suivant). Vérifiez que "virgule" est marqué (le marquage montrera déjà la séparation des données dans les colonnes ci-dessous) (suivant), dans cette fenêtre, vous pouvez choisir la colonne que vous voulez et la marquer comme texte (au lieu de général) (Terminer).

HTH


L'effort manuel était également peu attrayant pour moi. Cependant, après avoir épuisé toutes les possibilités, celle-ci était la plus robuste et la plus fiable.
Ana Maria Mendes-Pereira

Traitement par lots néanmoins.
Ana Maria Mendes-Pereira,

C'est en fait la meilleure réponse ici qui nécessite le moins de travail. Je souhaite que vous puissiez simplement définir une option pour le forcer à ne pas analyser le fichier.
roule

Vous pouvez également remplacer toutes les virgules par des tabulations, puis elles seront automatiquement supprimées
roule

10

Voici la méthode simple que nous utilisons ici lors de la génération du fichier csv, elle modifie un peu les valeurs, elle n'est donc pas adaptée à toutes les applications:

Ajouter un espace à toutes les valeurs dans le csv

Cet espace sera supprimé par Excel de nombres tels que "1", "2.3" et "-2.9e4", mais restera à des dates comme "01/10/1993" et des booléens comme "TRUE", en empêchant leur conversion en les types de données internes d'Excel.

Cela empêche également les guillemets doubles d'être zappés lors de la lecture, donc une façon infaillible de faire en sorte que le texte dans un csv reste inchangé par Excel MÊME SI un texte comme "3.1415" est de l'entourer de guillemets doubles ET d'ajouter la chaîne entière avec un espace, c'est-à-dire (en utilisant des guillemets simples pour montrer ce que vous tapez) '"3.1415"'. Ensuite, dans Excel, vous avez toujours la chaîne d'origine, sauf qu'elle est entourée de guillemets doubles et précédée d'un espace, vous devez donc en tenir compte dans toutes les formules, etc.


Cela a fonctionné pour moi. J'ai eu quelques valeurs comme 1-1-1 qui sont converties automatiquement en dates. Comme mentionné, l'espace sera transféré de sorte que la valeur est modifiée, mais je fais une bande dessus lors de l'analyse, donc pour moi ce n'est pas un gros problème.
jacklin

L'espace ne fonctionne plus pour empêcher l'interprétation des dates ou la suppression des zéros non significatifs. Mais vous pouvez utiliser un espace insécable à la "\xA0"place - cela fonctionnera.
Doin

8

(En supposant qu'Excel 2003 ...)

Lorsque vous utilisez l'assistant de conversion de texte en colonnes, à l'étape 3, vous pouvez dicter le type de données pour chacune des colonnes. Cliquez sur la colonne dans l'aperçu et modifiez la colonne de mauvais comportement de «Général» à «Texte».


8
C'est un excellent choix si je pouvais forcer l'utilisateur à utiliser le processus d'importation.

En fait, cela n'aide pas le problème, car les nombres dans la colonne TEXT seront convertis en NUMBERS lors de l'exportation vers .csv de toute façon ...
Chonez

8

C'est la seule façon pour moi de le faire sans gâcher le fichier lui-même. Comme d'habitude avec Excel, j'ai appris cela en me frappant la tête sur le bureau pendant des heures.

Modifiez l'extension de fichier .csv en .txt; cela empêchera Excel de convertir automatiquement le fichier lorsqu'il est ouvert. Voici comment je le fais: ouvrez Excel dans une feuille de calcul vierge, fermez la feuille vierge, puis Fichier => Ouvrir et choisissez votre fichier avec l'extension .txt. Cela force Excel à ouvrir l '"Assistant d'importation de texte" où il vous posera des questions sur la façon dont vous souhaitez qu'il interprète le fichier. Vous choisissez d'abord votre délimiteur (virgule, tabulation, etc ...), puis (voici la partie importante) vous choisissez un ensemble de colonnes de colonnes et sélectionnez la mise en forme. Si vous voulez exactement ce qu'il y a dans le fichier, choisissez "Texte" et Excel affichera exactement ce qu'il y a entre les délimiteurs.


Cela a très bien fonctionné pour moi le 03/03/2015 en travaillant avec Excel pour Mac 2011 (version 14.4.8 150116), en travaillant avec les données de la question SO awk- évitez de reformater les valeurs de type date , où le problème est plutôt avec Excel que awk, malgré le titre de la question.
Jonathan Leffler

4

(EXCEL 2007 et versions ultérieures)

Comment forcer Excel à ne pas "détecter" les formats de date sans modifier le fichier source

Soit:

  • renommer le fichier en .txt
  • Si vous ne pouvez pas le faire, au lieu d'ouvrir le fichier CSV directement dans Excel, créez un nouveau classeur, puis accédez à
    Data > Get external data > From Text
    et sélectionnez votre CSV.

Quoi qu'il en soit, vous serez présenté avec des options d'importation, sélectionnez simplement chaque colonne contenant les dates et dites à Excel de formater comme "texte" et non "général".


4

Ce que j'ai fait pour ce même problème était d'ajouter les éléments suivants avant chaque valeur csv: "=" "" et un guillemet double après chaque valeur CSV, avant d'ouvrir le fichier dans Excel. Prenez par exemple les valeurs suivantes:

012345,00198475

Ceux-ci doivent être modifiés avant l'ouverture dans Excel pour:

"="""012345","="""00198475"

Après cela, chaque valeur de cellule apparaît sous forme de formule dans Excel et ne sera donc pas formatée sous forme de nombre, de date, etc. Par exemple, une valeur de 012345 apparaît comme:

="012345"

Une autre approche consiste à stocker le nombre dans le csv sous 1234500198475E-8; De cette façon, d'autres calculs dans Excel seront toujours possibles.
bert bruynooghe

4

Aucune des solutions proposées ici n'est une bonne solution. Cela peut fonctionner pour des cas individuels, mais uniquement si vous contrôlez l'affichage final. Prenons mon exemple: mon travail produit une liste de produits qu'ils vendent au détail. Ceci est au format CSV et contient des codes pièce, certains d'entre eux commencent par des zéro, définis par les fabricants (non sous notre contrôle). Supprimez les zéros de tête et vous pouvez en fait correspondre à un autre produit. Les clients au détail veulent la liste au format CSV en raison de programmes de traitement back-end, qui sont également hors de notre contrôle et différents par client, nous ne pouvons donc pas changer le format des fichiers CSV. Pas de "=" préfixé, ni d'onglets ajoutés. Les données dans les fichiers CSV bruts sont correctes; c'est lorsque les clients ouvrent ces fichiers dans Excel que les problèmes commencent. Et de nombreux clients ne sont pas vraiment avertis en informatique. Ils peuvent à peu près ouvrir et enregistrer une pièce jointe. Nous envisageons de fournir les données dans deux formats légèrement différents: l'un en tant qu'Excel Friendly (en utilisant les options suggérées ci-dessus en ajoutant un TAB, l'autre en tant que «maître». Mais cela peut être un vœu pieux car certains clients ne comprendront pas pourquoi nous devons le faire. Pendant ce temps, nous continuons d'expliquer pourquoi ils voient parfois de «mauvaises» données dans leurs feuilles de calcul. Jusqu'à ce que Microsoft apporte un changement approprié, je ne vois aucune résolution appropriée à cela, tant que l'on n'a aucun contrôle sur la façon dont les utilisateurs finaux utilisez les fichiers. Mais cela peut être un vœu pieux car certains clients ne comprendront pas pourquoi nous devons le faire. Pendant ce temps, nous continuons d'expliquer pourquoi ils voient parfois de «mauvaises» données dans leurs feuilles de calcul. Jusqu'à ce que Microsoft apporte une modification appropriée, je ne vois aucune résolution appropriée à cela, tant que l'on n'a aucun contrôle sur la façon dont les utilisateurs finaux utilisent les fichiers. Mais cela peut être un vœu pieux car certains clients ne comprendront pas pourquoi nous devons le faire. Pendant ce temps, nous continuons d'expliquer pourquoi ils voient parfois de «mauvaises» données dans leurs feuilles de calcul. Jusqu'à ce que Microsoft apporte une modification appropriée, je ne vois aucune résolution appropriée à cela, tant que l'on n'a aucun contrôle sur la façon dont les utilisateurs finaux utilisent les fichiers.


Si un espace supplémentaire à gauche de vos données n'a pas d'importance, vous pouvez résoudre les problèmes d'Excel en ajoutant "\xA0"(espace insécable) à vos données.
Doin

3

J'ai rencontré cette semaine cette convention, qui semble être une excellente approche, mais je ne la trouve nulle part référencée. Quelqu'un le connaît-il? Pouvez-vous citer une source pour cela? Je n'ai pas cherché des heures et des heures mais j'espère que quelqu'un reconnaîtra cette approche.

Exemple 1: = ("012345678905") s'affiche comme 012345678905

Exemple 2: = ("1954-12-12") s'affiche comme 1954-12-12 , pas 12/12/1954 .


2

Ce n'est pas Excel. Windows reconnaît la formule, les données comme une date et les corrections automatiques. Vous devez modifier les paramètres de Windows.

"Panneau de configuration" (-> "Passer à l'affichage classique") -> "Options régionales et linguistiques" -> onglet "Options régionales" -> "Personnaliser ..." -> onglet "Numéros" -> Et puis modifier les symboles selon ce que vous voulez.

http://www.pcreview.co.uk/forums/enable-disable-auto-convert-number-date-t3791902.html

Cela fonctionnera sur votre ordinateur, si ces paramètres ne sont pas modifiés par exemple sur l'ordinateur de vos clients, ils verront les dates au lieu des données.


2

Salut, j'ai le même problème,

J'écris ce vbscipt pour créer un autre fichier CSV. Le nouveau fichier CSV aura un espace dans la police de chaque champ, donc Excel le comprendra comme du texte.

Vous créez donc un fichier .vbs avec le code ci-dessous (par exemple Modify_CSV.vbs), l'enregistrez et le fermez. Faites glisser et déposez votre fichier d'origine dans votre fichier vbscript. Il créera un nouveau fichier avec "SPACE_ADDED" au nom du fichier au même emplacement.

Set objArgs = WScript.Arguments

Set objFso = createobject("scripting.filesystemobject")

dim objTextFile
dim arrStr ' an array to hold the text content
dim sLine  ' holding text to write to new file

'Looping through all dropped file
For t = 0 to objArgs.Count - 1
    ' Input Path
    inPath = objFso.GetFile(wscript.arguments.item(t))

    ' OutPut Path
    outPath = replace(inPath, objFso.GetFileName(inPath), left(objFso.GetFileName(inPath), InStrRev(objFso.GetFileName(inPath),".") - 1) & "_SPACE_ADDED.csv")

    ' Read the file
    set objTextFile = objFso.OpenTextFile(inPath)


    'Now Creating the file can overwrite exiting file
    set aNewFile = objFso.CreateTextFile(outPath, True) 
    aNewFile.Close  

    'Open the file to appending data
    set aNewFile = objFso.OpenTextFile(outPath, 8) '2=Open for writing 8 for appending

    ' Reading data and writing it to new file
    Do while NOT objTextFile.AtEndOfStream
        arrStr = split(objTextFile.ReadLine,",")

        sLine = ""  'Clear previous data

        For i=lbound(arrStr) to ubound(arrStr)
            sLine = sLine + " " + arrStr(i) + ","
        Next

        'Writing data to new file
        aNewFile.WriteLine left(sLine, len(sLine)-1) 'Get rid of that extra comma from the loop


    Loop

    'Closing new file
    aNewFile.Close  

Next ' This is for next file

set aNewFile=nothing
set objFso = nothing
set objArgs = nothing

2

Sans modifier votre fichier csv, vous pouvez:

  1. Changez l'option Excel Format Cells en "texte"
  2. Utilisez ensuite l '"Assistant d'importation de texte" pour définir les cellules csv.
  3. Une fois importé, supprimez ces données
  4. puis collez simplement en texte brut

Excel formatera et séparera correctement vos cellules csv sous forme de texte en ignorant les formats de date automatique.

Une sorte de travail idiot, mais il vaut mieux modifier les données csv avant l'importation. Andy Baird et Richard ont en quelque sorte éludé cette méthode, mais ont raté quelques étapes importantes.


1

Je sais que c'est un vieux fil. Pour ceux comme moi, qui ont toujours ce problème en utilisant Office 2013 via l'objet powershell com, ils peuvent utiliser la méthode opentext . Le problème est que cette méthode a de nombreux arguments, qui sont parfois mutuellement exclusifs. Pour résoudre ce problème, vous pouvez utiliser la méthode invoke-namedparameter présentée dans cet article . Un exemple serait

$ex = New-Object -com "Excel.Application"
$ex.visible = $true
$csv = "path\to\your\csv.csv"
Invoke-NamedParameter ($ex.workbooks) "opentext" @{"filename"=$csv; "Semicolon"= $true}

Malheureusement, je viens de découvrir que cette méthode rompt en quelque sorte l'analyse csv lorsque les cellules contiennent des sauts de ligne. Ceci est supporté par csv mais l'implémentation des microsofts semble être buggée. De plus, il n'a pas détecté les caractères spécifiques à l'allemand. Le fait de lui donner la bonne culture n'a pas changé ce comportement. Tous les fichiers (csv et script) sont enregistrés avec l'encodage utf8. J'ai d'abord écrit le code suivant pour insérer la cellule csv cellule par cellule.

$ex = New-Object -com "Excel.Application"
$ex.visible = $true;
$csv = "path\to\your\csv.csv";
$ex.workbooks.add();
$ex.activeWorkbook.activeSheet.Cells.NumberFormat = "@";
$data = import-csv $csv -encoding utf8 -delimiter ";"; 
$row = 1; 
$data | %{ $obj = $_; $col = 1; $_.psobject.properties.Name |%{if($row -eq1){$ex.ActiveWorkbook.activeSheet.Cells.item($row,$col).Value2= $_ };$ex.ActiveWorkbook.activeSheet.Cells.item($row+1,$col).Value2 =$obj.$_; $col++ }; $row++;}

Mais c'est extrêmement lent, c'est pourquoi j'ai cherché une alternative. Apparemment, Excel vous permet de définir les valeurs d'une plage de cellules avec une matrice. J'ai donc utilisé l'algorithme de ce blog pour transformer le csv en multiarray.

function csvToExcel($csv,$delimiter){
     $a = New-Object -com "Excel.Application"
     $a.visible = $true

    $a.workbooks.add()
     $a.activeWorkbook.activeSheet.Cells.NumberFormat = "@"
     $data = import-csv -delimiter $delimiter $csv; 
     $array = ($data |ConvertTo-MultiArray).Value
     $starta = [int][char]'a' - 1
     if ($array.GetLength(1) -gt 26) {
         $col = [char]([int][math]::Floor($array.GetLength(1)/26) + $starta) + [char](($array.GetLength(1)%26) + $Starta)
     } else {
         $col = [char]($array.GetLength(1) + $starta)
     }
     $range = $a.activeWorkbook.activeSheet.Range("a1:"+$col+""+$array.GetLength(0))
     $range.value2 = $array;
     $range.Columns.AutoFit();
     $range.Rows.AutoFit();
     $range.Cells.HorizontalAlignment = -4131
     $range.Cells.VerticalAlignment = -4160
}

 function ConvertTo-MultiArray {
     param(
         [Parameter(Mandatory=$true, Position=1, ValueFromPipeline=$true)]
         [PSObject[]]$InputObject
     )
     BEGIN {
         $objects = @()
         [ref]$array = [ref]$null
     }
     Process {
         $objects += $InputObject
     }
     END {
         $properties = $objects[0].psobject.properties |%{$_.name}
         $array.Value = New-Object 'object[,]' ($objects.Count+1),$properties.count
         # i = row and j = column
         $j = 0
         $properties |%{
             $array.Value[0,$j] = $_.tostring()
             $j++
         }
         $i = 1
         $objects |% {
             $item = $_
             $j = 0
             $properties | % {
                 if ($item.($_) -eq $null) {
                     $array.value[$i,$j] = ""
                 }
                 else {
                     $array.value[$i,$j] = $item.($_).tostring()
                 }
                 $j++
             }
             $i++
         }
         $array
     } 
} 
csvToExcel "storage_stats.csv" ";"

Vous pouvez utiliser le code ci-dessus tel qu'il devrait convertir tous les fichiers CSV en Excel. Modifiez simplement le chemin vers le csv et le caractère de délimitation en bas.


trop compliqué
roule

1

Dans mon cas, "Sept8" dans un fichier csv généré à l'aide de R a été converti en "8-sept" par Excel 2013. Le problème a été résolu en utilisant la fonction write.xlsx2 () dans le package xlsx pour générer le fichier de sortie au format xlsx , qui peut être chargé par Excel sans conversion indésirable. Donc, si vous recevez un fichier csv, vous pouvez essayer de le charger dans R et de le convertir en xlsx en utilisant la fonction write.xlsx2 ().


Je ne sais pas pourquoi votre réponse est rejetée. Il est utile aux personnes au moins qui utilisent R. Cette réponse m'a aidé. Merci :)
sriharsha KB

1

Une solution de contournement en utilisant Google Drive (ou Numbers si vous êtes sur un Mac):

  1. Ouvrez les données dans Excel
  2. Définissez le format de la colonne contenant des données incorrectes sur Texte (Format> Cellules> Nombre> Texte)
  3. Chargez le fichier .csv dans Google Drive et ouvrez-le avec Google Sheets
  4. Copiez la colonne incriminée
  5. Coller la colonne dans Excel en tant que texte (Édition> Collage spécial> Texte)

Alternativement, si vous êtes sur un Mac pour l'étape 3, vous pouvez ouvrir les données dans Numbers.


C'est une solution sensée plutôt que de travailler dessus pendant des heures sans aucune résolution.
imsrgadich

1

(EXCEL 2016 et versions ultérieures, en fait, je n'ai pas essayé dans les anciennes versions)

  1. Ouvrir une nouvelle page vierge
  2. Allez dans l'onglet "Données"
  3. Cliquez sur "From Text / CSV" et choisissez votre fichier csv
  4. Vérifiez dans l'aperçu si vos données sont correctes.
  5. Dans le cas où une colonne est convertie en date, cliquez sur "modifier", puis sélectionnez Texte en cliquant sur le calendrier en tête de colonne
  6. Cliquez sur "Fermer et charger"

0

OK a trouvé un moyen simple de le faire dans Excel 2003 à 2007. Ouvrez un classeur xls vierge. Ensuite, allez dans le menu Données, importez des données externes. Sélectionnez votre fichier csv. Parcourez l'assistant, puis dans "format de données de colonne", sélectionnez n'importe quelle colonne qui doit être forcée à "texte". Cela importera cette colonne entière sous forme de texte empêchant Excel d'essayer de traiter des cellules spécifiques comme une date.


0

Ce problème est toujours présent dans Mac Office 2011 et Office 2013, je ne peux pas l'empêcher de se produire. Cela semble une chose tellement fondamentale.

Dans mon cas, j'avais des valeurs telles que "1 - 2" et "7 - 12" dans le CSV correctement enfermé entre des virgules inversées, cela se convertit automatiquement en une date dans Excel, si vous essayez ensuite de le convertir en texte simple, vous obtiendrez une représentation numérique de la date telle que 43768. De plus, il reformate les grands nombres trouvés dans les codes-barres et les numéros EAN en nombres 123E + qui ne peuvent pas être reconvertis.

J'ai constaté que Google Sheets de Google Drive ne convertit pas les nombres en dates. Les codes-barres contiennent des virgules tous les 3 caractères, mais ils sont facilement supprimés. Il gère très bien les CSV, en particulier lorsqu'il s'agit de CSV MAC / Windows.

Pourrait sauver quelqu'un un jour.


0

SOLUTION LA PLUS FACILE Je viens de comprendre cela aujourd'hui.

  • Ouvrir dans Word
  • Remplacer tous les tirets par des tirets
  • Sauver et fermer
  • Ouvrir dans Excel

Une fois la modification terminée, vous pouvez toujours l'ouvrir à nouveau dans Word pour remplacer à nouveau les tirets en par des tirets.


0

Je fais cela pour les numéros de carte de crédit qui continuent de se convertir en notation scientifique: je finis par importer mon .csv dans Google Sheets. Les options d'importation permettent désormais de désactiver le formatage automatique des valeurs numériques. Je mets toutes les colonnes sensibles en texte brut et télécharge au format xlsx.

C'est un flux de travail terrible, mais au moins mes valeurs restent telles qu'elles devraient être.


Si vous vous donnez la peine de lire certaines des autres réponses, vous verrez que quelqu'un l'a déjà suggéré ici .
Laurel

J'ai pris la peine, merci. Je pense que la sélection de formatage automatique est une nouvelle partie du processus d'importation. Ma réponse fournit un flux de travail très spécifique, pour ceux qui, comme moi, ont été obligés d'utiliser des feuilles pour faire face à ce problème spécifique. À mon avis, cela méritait une réponse distincte. Un ajustement mineur de votre ton pourrait en fait faire en sorte que votre commentaire soit interprété comme utile, ce qui est tout l'intérêt de cette famille de sites Web.
Brendonwbrown

Mais vous pouvez simplement utiliser l'importation de texte dans Excel pour importer le fichier CSV et ne pas vous embêter avec des feuilles, comme indiqué dans d'autres réponses.
NetMage

0

J'ai fait cette macro vba qui formate essentiellement la plage de sortie sous forme de texte avant de coller les nombres. Fonctionne parfaitement pour moi lorsque je veux coller des valeurs telles que 8/11, 23/6, 1/3, etc. sans qu'Excel les interprète comme des dates.

Sub PasteAsText()
' Created by Lars-Erik Sørbotten, 2017-09-17
Call CreateSheetBackup

Columns(ActiveCell.Column).NumberFormat = "@"

Dim DataObj As MSForms.DataObject
Set DataObj = New MSForms.DataObject
DataObj.GetFromClipboard

ActiveCell.PasteSpecial

End Sub

Je suis très intéressé de savoir si cela fonctionne aussi pour d'autres personnes. Je cherchais une solution à ce problème depuis un certain temps, mais je n'ai jamais vu de solution vba rapide qui n'incluait pas l'insertion 'devant le texte d'entrée. Ce code conserve les données dans leur forme d'origine.


-1

Si vous mettez une virgule inversée au début du champ, elle sera interprétée comme du texte.

Exemple: 25/12/2008devient'25/12/2008

Vous pouvez également sélectionner le type de champ lors de l'importation.


9
Je ne veux pas de 'au début de mes données.

27
-1. Le 'ne fonctionne que lorsqu'il est entré directement dans Excel, mais il ne fonctionne pas en CSV - vous auriez un caractère supplémentaire' dans la cellule Excel après l'importation.
TMS

-1

Une autre méthode:

Convertissez le format de la colonne que vous souhaitez modifier en «Texte». Sélectionnez toutes les cellules que vous souhaitez conserver, copiez. Sans désélectionner ces colonnes, cliquez sur "Edition> Collage spécial> Comme valeurs"

Enregistrez au format CSV. Notez que cela doit être la dernière chose que vous faites au fichier, car lorsque vous le rouvrez, il se formatera en tant que dates car les formats de cellule ne peuvent pas être enregistrés dans des fichiers CSV.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.