Est-ce que quelqu'un sait s'il existe un jeton que je peux ajouter à mon CSV pour un certain champ afin qu'Excel n'essaye pas de le convertir en date?
J'essaie d'écrire un fichier .csv à partir de mon application et l'une des valeurs ressemble suffisamment à une date à laquelle Excel le convertit automatiquement d'un texte à une date. J'ai essayé de mettre tous mes champs de texte (y compris celui qui ressemble à une date) entre guillemets, mais cela n'a aucun effet.
J'ai trouvé que mettre un '=' avant les doubles guillemets fera ce que vous voulez. Cela force les données à être du texte.
par exemple. = "2008-10-03", = "plus de texte"
EDIT (selon d'autres publications) : à cause de le bogue d'Excel 2007 noté par Jeffiekins , il faut utiliser solution proposée par Andrew : "=""2008-10-03"""
Je sais que c'est une vieille question, mais le problème ne va pas disparaître rapidement. 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 en clair 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 obtient également converti du texte en chiffres. Quelques exemples où cela pose problème:
qui parfois peut commencer par un ou plusieurs zéros (0), qui sont jetés lorsqu’ils sont convertis en chiffres. 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éale est
Si on ajoute/ajoute un caractère non numérique et/ou non-date à la valeur, celle-ci sera reconnue comme texte et non convertie. Un caractère non imprimable serait utile car il ne modifiera pas la valeur affichée. Toutefois, l'ancien caractère d'espace brut (\ s, ASCII 32) ne fonctionne pas pour cela car il est découpé par Excel et la valeur est toujours convertie. Mais , il existe divers autres caractères d’espace d’impression ou non qui fonctionneront bien. Le plus simple consiste toutefois à ajouter (ajouter après) le caractère de tabulation simple (\ t, ASCII 9).
Avantages de cette approche:
S'il y a une raison pour laquelle vous ne souhaitez pas utiliser l'onglet, recherchez dans un tableau Unicode quelque chose d'autre qui convient.
il peut s’agir de générer des fichiers XML, pour lesquels un certain format est également accepté pour importation par les versions les plus récentes de MS Excel, et qui offre beaucoup plus d’options similaires au format .XLS, mais je n’ai pas d’expérience.
Donc, il y a différentes options. En fonction de vos exigences/applications, l'une pourrait être meilleure qu'une autre.
Il faut dire que les versions les plus récentes (2013+) de MS Excel n'ouvrent plus le CSV sous forme de feuille de calcul - un ralentissement supplémentaire dans le 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? .
En travaillant à partir de la solution de Jarod et du problème soulevé par Jeffiekins, vous pouvez modifier
"May 16, 2011"
à
"=""May 16, 2011"""
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", telle que "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'expert, 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-leur le type "Texte" au lieu de "Général" pour empêcher Excel de modifier vos données.
J'espère que cela vous aide ou aide quelqu'un avec un problème similaire!
ATTENTION: Excel '07 (au moins) a un bogue a(nother): s'il y a une virgule dans le contenu d'un champ, il n'analyse pas correctement le = "champ, contenu", mais place 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 inclut une virgule.
Cela peut signifier que certains champs sont impossibles à représenter exactement "correctement" dans Excel, mais je suis convaincu que personne n'est trop surpris.
Lors de la création de la chaîne à écrire dans mon fichier CSV en C #, je devais la formater de la manière suivante:
"=\"" + myVariable + "\""
Dans Excel 2010, ouvrez une nouvelle feuille. Sur le ruban de données, cliquez sur "Obtenir les données externes du texte". Sélectionnez votre fichier CSV puis cliquez sur "Ouvrir". Cliquez sur Suivant". Décochez "Tab", cochez la case "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, exactement comme dans le fichier CSV.
Reste un problème dans la version Microsoft Office 2016, plutôt inquiétant 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 Excel:
HTH
Voici la méthode simple que nous utilisons à l’œuvre ici lors de la génération du fichier csv. Elle modifie un peu les valeurs et n’est donc pas adaptée à toutes les applications:
Ajouter un espace à toutes les valeurs du fichier csv
Excel va supprimer cet espace des chiffres tels que "1", "2.3" et "-2.9e4" mais restera à des dates telles que "01/10/1993" et des booléens comme "TRUE", les empêchant de les convertir en Les types de données internes d'Excel.
Il évite également que les guillemets ne soient zappés lors de la lecture. Un moyen infaillible de créer du texte dans un fichier csv reste donc inchangé par Excel. Même si un texte du type "3.1415" consiste à l’entourer de guillemets ET à précéder toute la chaîne d’un espace, c'est-à-dire (en utilisant des guillemets simples pour montrer ce que vous voudriez taper) '"3.1415"'. Ensuite, dans Excel, vous avez toujours la chaîne d'origine, sauf qu'elle est entourée de guillemets et précédée d'un espace. Vous devez donc en tenir compte dans les formules, etc.
C’est la seule façon pour moi de réaliser cela sans me gêner à l’intérieur du fichier. Comme d'habitude avec Excel, j'ai appris cela en frappant ma tête sur le bureau pendant des heures.
Modifier l'extension de fichier .csv en .txt; cela empêchera Excel de convertir automatiquement le fichier à son ouverture. 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 oblige Excel à ouvrir l '"Assistant d'importation de texte" où il vous posera des questions sur la manière dont vous souhaitez interpréter le fichier. Tout d'abord, vous choisissez 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 juste ce qu'il y a entre les délimiteurs.
(En supposant qu'Excel 2003 ...)
Lorsque vous utilisez le texte en colonnes Wizard a, à l'étape 3, vous pouvez dicter le type de données pour chacune des colonnes. Cliquez sur la colonne dans l'aperçu et remplacez la colonne "Général" par "Texte".
2018
La seule solution appropriée qui a fonctionné pour moi (et aussi sans modifier le CSV).
Excel 2010:
Excel office365: (version client)
Remarque: Excel office365 (version Web), au moment où j'écris ceci, vous ne pourrez pas le faire.
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 de pièces, dont certains commencent par des zéros, définis par les fabricants (pas sous notre contrôle). Enlevez les zéros de tête et vous pourrez peut-être associer un autre produit. Les clients de 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 modifier le format des fichiers CSV. Pas de préfixe '=', ni d'onglets ajoutés. Les données contenues dans les fichiers CSV bruts sont correctes. c'est lorsque les clients ouvrent ces fichiers dans Excel que les problèmes commencent. Et beaucoup de clients ne sont pas vraiment férus d’informatique. Ils peuvent à peu près ouvrir et sauvegarder une pièce jointe à un courriel. Nous envisageons de fournir les données dans deux formats légèrement différents: l’un en tant que Excel Friendly (en utilisant les options suggérées ci-dessus en ajoutant une tabulation, l’autre en tant que "maître". Ce peut être un voeu pieux, car certains clients ne comprendront pas pourquoi. Entre-temps, nous continuons à expliquer pourquoi ils voient parfois des "données fausses" dans leurs feuilles de calcul. Jusqu'à ce que Microsoft apporte une modification appropriée, je ne vois aucune solution appropriée à ce problème, tant que l'on ne contrôle pas utiliser les fichiers.
(Excel 2007 et versions ultérieures)
soit:
Data > Get external data > From Text
Dans les deux cas, des options d’importation vous seront présentées. Il vous suffit de sélectionner chaque colonne contenant des dates et d’indiquer à Excel de formater en tant que "texte" et non "général".
Ce que j'ai fait pour ce même problème a été d'ajouter ce qui suit avant chaque valeur csv: "=" "" et un guillemet double après chaque valeur CSV, avant d'ouvrir le fichier dans Excel. Prenez les valeurs suivantes par exemple:
012345,00198475
Ceux-ci doivent être modifiés avant d’ouvrir dans Excel pour:
"="""012345","="""00198475"
Ensuite, 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 suit:
="012345"
Cette semaine, j’ai le droit de tomber sur cette convention, qui semble être une excellente approche, mais je ne la trouve nulle part référencée. Quelqu'un est-il au courant? Pouvez-vous citer une source pour cela? Je n'ai pas cherché depuis des heures et des heures, mais j'espère que quelqu'un reconnaîtra cette approche.
Exemple 1: = ("012345678905") s'affiche sous la forme 12345678905
Exemple 2: = ("1954-12-12") s'affiche sous la forme 1954-12-12, pas 12/12/1954.
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 sous forme de texte.
Vous créez donc un fichier .vbs avec le code ci-dessous (par exemple, Modify_CSV.vbs), enregistrez-le et fermez-le. Glisser-déposer votre fichier d'origine dans votre fichier vbscript. Il créera un nouveau fichier avec "SPACE_ADDED" pour le 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
Sans modifier votre fichier csv, vous pouvez:
Excel formatera et séparera correctement vos cellules csv sous forme de texte en ignorant les formats de date automatiques.
C'est un peu ridicule, mais cela vaut mieux que de modifier les données CSV avant de les importer. Andy Baird et Richard ont en quelque sorte éludé cette méthode, mais ont manqué quelques étapes importantes.
Ce n'est pas l'Excel. Windows reconnaît la formule, les données en tant que date et les corrige automatiquement. Vous devez modifier les paramètres Windows.
"Panneau de configuration" (-> "Basculer vers l'affichage classique") -> "Options régionales et linguistiques" -> onglet "Options régionales" -> "Personnaliser ..." -> onglet "Nombres" -> 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 des dates au lieu de données.
Solution de contournement à l'aide de Google Drive (ou de Numbers si vous êtes sur un Mac):
Si vous utilisez un Mac pour l’étape 3, vous pouvez également ouvrir les données dans Numbers.
(Excel 2016 et ultérieur, en fait je n'ai pas essayé dans les anciennes versions)
Dans mon cas, "Sept8" dans un fichier csv généré avec 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. Ainsi, si vous recevez un fichier csv, vous pouvez essayer de le charger dans R et de le convertir en xlsx à l'aide de la fonction write.xlsx2 ().
Je sais que c'est un vieux fil. Pour ceux qui, comme moi, ont encore ce problème lors de l'utilisation de office 2013 via l'objet powershell com peuvent utiliser le 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 introduite dans this post . 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 casse l’analyse csv lorsque les cellules contiennent des sauts de ligne. Cela est supporté par csv mais l'implémentation de microsofts semble être boguée. En outre, il n'a pas détecté de 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 le codage utf8. J'ai d'abord écrit le code suivant pour insérer le 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 dans ce blog pour transformer le csv en multi-tableau.
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 quel, il devrait convertir tout csv en Excel. Il suffit de changer le chemin d'accès au csv et au caractère de délimitation au bas.
Okay 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 une colonne devant être forcée à "texte". Cela importera toute la colonne en tant que format de texte empêchant Excel d'essayer de traiter des cellules spécifiques comme une date.
SOLUTION LA PLUS FACILE Je viens de comprendre cela aujourd'hui.
Une fois que vous avez terminé vos modifications, vous pouvez toujours les ouvrir à nouveau dans Word pour remplacer à nouveau les tirets en trait par des traits d'union.
Coller le tableau dans Word. Effectuez une recherche/remplacement et changez tous les - (tirets) en - (double tiret). Copier et coller dans Excel. Peut faire la même chose pour d'autres symboles (/), etc. S'il est nécessaire de revenir à un tiret une fois dans Excel, formatez simplement la colonne en texte, puis apportez la modification. J'espère que cela t'aides.
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 fichier CSV correctement insérées entre guillemets. Ceci convertit automatiquement une date dans Excel. Si vous essayez ensuite de le convertir en texte brut, 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 numéros 123E + qui ne peuvent pas être reconvertis.
J'ai constaté que Google Sheets de Google Drive ne convertissait pas les chiffres en dates. Les codes à barres comportent 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.
Peut sauver quelqu'un de temps en temps.
Je le fais pour les numéros de carte de crédit qui convertissent sans cesse en notation scientifique: je finis par importer mon fichier .csv dans Google Sheets. Les options d'importation permettent maintenant de désactiver le formatage automatique des valeurs numériques. Je règle toutes les colonnes sensibles en texte brut et les télécharge en tant que xlsx.
C'est un flux de travail épouvantable, mais au moins mes valeurs restent telles qu'elles devraient être.
J'ai créé cette macro vba qui formate la plage de sortie en tant que 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 moment, mais je n’avais jamais vu de solution rapide pour vba qui n'incluait pas l'insertion de 'devant le texte saisi. Ce code conserve les données dans leur forme originale.