107 votes

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

J'ai cherché pendant un certain temps comment sortir 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 les convertir "intelligemment" dans ses formats natifs de date/nombre. Existe-t-il un moyen de contourner cela ?


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

108voto

Paul Nearney Points 5502

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"""

eg...

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

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

Si vous pensez que les données peuvent contenir des citations, vous devez double-évasion comme ça...

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

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

23voto

DMA57361 Points 18266

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

Vous pouvez le trouver comme Data Get External Data From Text dans Excel 2007/2010.
Ou Data Import External Data Import Data dans Excel 2003.

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

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

3voto

Shane K Points 131

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 :

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 le suivant ="VALUE", pas "=""VALUE""", ce qui, je crois, peut être une convention Visual Basic.

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

1voto

richjhart Points 13

J'ai eu des problèmes avec la réponse de Simon si le texte en question était trop long (en raison, je pense, d'un bug dans Excel : https://superuser.com/a/776614/1084793 ). La réponse de Shane n'a pas fonctionné pour moi s'il y avait une virgule dans la chaîne.

J'ai également eu des problèmes en utilisant le = si le test contient un caractère de nouvelle ligne.

Dans les deux cas (s'il est long ou s'il comporte une nouvelle ligne), j'espère qu'Excel l'interprétera correctement de toute façon.

Voici donc le code C# que j'utilise actuellement :

private string content;
public String Content
{
    get
    {
        // escape double-quotes first, to get the right length of the output
        string output = content.Replace("\"", "\"\"\"\"");
        if (output.Length > 255 || content.Contains("\n"))
        {
            // just output with double-quotes ("hello")
            return "\"" + content.Replace("\"", "\"\"") + "\"";
        }
        else
        {
            // output with the equals ("=""hello""")
            return "\"=\"\"" +
                output +
                "\"\"\"";
        }
    }
    set
    {
        content = value;
    }
}

Jusqu'à présent, cela fonctionne pour tous mes scénarios. Si quelqu'un a une solution pour contourner le problème de la nouvelle ligne ou du caractère 255 tout en utilisant la méthode "=", je serais très intéressé.

-1voto

Ben Waine Points 669

Une façon simple de forcer Excel à interpréter la date comme du texte est de mettre un guillemet simple devant la date, au lieu d'utiliser les guillemets complets, comme dans :

'10/11/2002

Si vous pouvez importer le CSV au lieu de l'ouvrir, vous pouvez indiquer à Excel le format de chaque colonne. Jetez un coup d'œil à cette question que j'ai posée .

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