Formattazione di un CSV delimitato da virgole per forzare Excel a interpretare il valore come una stringa


64

Ho cercato per un po 'di tempo cercando di capire come produrre un file CSV in modo tale da forzare Excel a interpretare i valori come una stringa e non provare a convertirli in numeri o date.

per esempio:

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

Excel tenta di convertire "in modo intelligente" tutti questi nei formati di data / numero nativi. C'è un modo per aggirare questo?


EDIT: chiarito l'intento della mia domanda, scusate la confusione.

Risposte:


67

Per quelli che hanno il controllo sui dati di origine, apparentemente Excel rileverà automaticamente il formato di un campo CSV a meno che la colonna CSV non sia in questo formato:

"=""Data Here"""

per esempio...

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

Funziona anche in Google Spreadsheet, ma non è sicuro se altre app per fogli di calcolo supportano questa notazione.

Se si sospetta che uno qualsiasi dei dati contenga virgolette, è necessario eseguirne il doppio escape , in questo modo ...

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



(EDIT: aggiornato con correzioni, grazie DMA57361!)


Fantastico, dobbiamo solo cambiare i dati ... sigh
Pricey

4
L'ultima colonna dovrebbe essere "=""123"""altrimenti formata male. I campi contenenti a "devono essere delimitati e la "s nel campo deve essere salvata con altre "s.
DMA57361,

@ DMA57361 in realtà il modo in cui lo ha va bene, sono gli altri due campi accanto a cui manca il segno di uguale anteposto. Quello che ha messo lì è l'impostazione della formula di quella cella per restituire una stringa. Per evitare ciò, puoi impostare il tipo di dati della cella su "Testo".
Breakthrough

2
@Breakthrough che tabella lì rappresenta un file CSV, non campi Excel. L'ultimo valore ="123"non è un campo CSV valido perché contiene il carattere delimitatore di campo " senza delimitare correttamente o il campo. Il fatto che Excel lo legga come una formula dipende esclusivamente da Excel e non ha nulla a che fare con il file CSV.
DMA57361,

2
@PriceChild, il punto della mia domanda originale (che non ho spiegato molto bene) era in realtà come formattare il CSV per renderlo il più semplice possibile per gli utenti. E quindi questa è la risposta che mi sono ritrovato e che volevo pubblicare. DMA57361 in realtà ha portato anche una correzione utile, grazie!
Simon East,

36

Come molti, ho avuto difficoltà con le stesse decisioni prese da Microsoft e ho provato varie soluzioni suggerite.

Per Excel 2007 vale:

  • Mettere tutti i valori tra virgolette NON aiuta
  • Mettere an = prima di tutti i valori dopo averli messi in doppi quutes FA AIUTO, MA rende il file csv inutile per la maggior parte delle altre applicazioni
  • Mettere le parentesi attorno alle doppie virgolette attorno a tutti i valori è spazzatura
  • Mettere uno spazio prima di tutti i valori prima di racchiuderli tra virgolette NON impedisce le conversioni alle date, ma NON impedisce il taglio degli zero iniziali o finali.
  • Mettere una virgoletta singola davanti a un valore funziona solo quando si inseriscono dati in Excel.

Però:

Mettere una scheda prima di tutti i valori prima di racchiuderli tra virgolette DOES impedisce le conversioni alle date e DOES previene il taglio degli zero iniziali o finali e il foglio non mostra nemmeno cattivi marcatori di avvertimento nell'angolo in alto a sinistra di ogni cella.

Per esempio:

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

Si noti che il carattere di tabulazione deve essere racchiuso tra virgolette doppie. Modifica: si scopre che le doppie virgolette non sono nemmeno necessarie.

Facendo doppio clic sul file CSV è possibile aprire il file come foglio di calcolo in Excel che mostra tutti i valori trattati come sopra, come i dati di testo. Assicurati di impostare Excel per usare il '.' come il punto decimale e non il ',' o ogni riga del file CSV finirà come un testo nella prima cella di ogni riga. Apparentemente Microsoft pensa che CSV significhi "valore separato non decimale".


Questo trucco con le schede mi ha salvato la giornata, Excel stava convertendo valori numerici molto lunghi in numeri e ha perso tutte le cifre dopo il 15. Gestito per ottenere Excel per trattarli come testo con il prefisso della scheda. Quindi funziona anche per i numeri, non solo per le date.
Markus Yrjölä,

Questo è davvero utile, grazie!
Flavio,

22

L'uso della funzionalità di importazione di Excel consente di specificare il formato (auto, testo o data) in cui ogni colonna deve essere interpretata come e non richiede alcuna modifica ai file di dati.

Puoi trovarlo come DataGet External DataFrom Textin Excel 2007/2010.
Oppure DataImport External DataImport Datain Excel 2003.

Ecco un'immagine dell'Importazione guidata testo di Excel 2003 in azione sui dati di esempio forniti, che mi mostra come importare le ultime due colonne come testo:

Excel 2003: Importazione guidata di testo al passaggio 3 - tipi di dati


Ottima risposta DMA57361, grazie per tutti i dettagli. Quello che non ho menzionato nella mia domanda è che sto scrivendo uno script che esporta i dati in Excel, quindi stavo cercando di impedire agli utenti di saltare attraverso opzioni confuse come questa. Ma ti ho votato comunque. :-)
Simon East

@Simon, in che cosa stai scrivendo la sceneggiatura? In qualche modo puoi ottenerlo per produrre direttamente i file Excel effettivi, invece di passare attraverso un formato intermedio?
DMA57361

è uno script PHP che esporta una tabella di database. CSV è probabilmente il più semplice con cui lavorare, ma hai ragione, probabilmente potrei produrre un XLS con l'aiuto di un codice open-source, o anche solo una tabella HTML che penso dall'esperienza passata produce risultati ragionevoli in Excel (consente colori e formattazione ecc., ma non sono sicuro dei tipi di dati).
Simon East,

1
Ci sono alcune domande su SO su PHP → Excel, le prime che ho provato hanno tutte una risposta che punta a PHP Excel , quindi potrebbe valere la pena dare un'occhiata.
DMA57361

è molto utile, dopo aver letto alcune risposte
greg121

1

L'esempio di Simon non ha funzionato per me e sospetto che sia una differenza linguistica. In C # ecco come appare la mia stringa di formato di lavoro:

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);

e questo è come appare il file di output:

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

Come si può vedere, il formato nel file di output ="VALUE",non è quello "=""VALUE""",che credo possa essere una convenzione di Visual Basic.

Sto usando Excel 2010. Per inciso, Fogli Google non aprirà / convertirà un file formattato in questo modo. Funzionerà se rimuovi il segno di uguale in questo modo "VALUE",- Excel aprirà comunque il file ma ignorerà il fatto che vuoi che le tue colonne siano stringhe.


-2

Un modo semplice per forzare Excel a interpretare la data come testo è quello di mettere una virgoletta davanti alla data, invece di usare le virgolette complete, come in:

'10 / 11/2002

Se puoi importare il CSV invece di aprirlo, puoi dire ad Excel quale formato dovrebbe essere ogni colonna. Dai un'occhiata a questa domanda che ho posto .


5
Sottovalutato a causa di questo NON funziona nei file CSV importati in Excel. Excel interpreta la citazione come una citazione letterale e quindi la mostra nella cella.
psynnott,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.