2011-08-03 08:39:00 +0000 2011-08-03 08:39:00 +0000
64
64

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

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

ad es:

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

Excel cerca di convertire “intelligentemente” tutti questi nei suoi formati nativi di data/numero. C'è un modo per aggirare questo problema?


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

Risposte (5)

70
70
70
2011-08-03 08:39:57 +0000

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 sia in questo formato:

"=""Data Here"""

es…

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

Funziona anche in Google Spreadsheet, ma non so se altre applicazioni per fogli di calcolo supportano questa notazione.

Se sospettate che qualche dato possa contenere le virgolette, dovete doppiare le virgolette, come questo…

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

(EDIT: Aggiornato con correzioni, grazie DMA57361!)

39
39
39
2014-01-20 13:02:48 +0000

Come molti, ho lottato con le stesse decisioni di Microsoft e ho provato varie soluzioni suggerite.

Per Excel 2007 vale quanto segue:

  • Mettere tutti i valori tra virgolette doppie NON aiuta
  • Mettere un = prima di tutti i valori dopo averli messi tra virgolette doppie aiuta, MA rende il file csv inutile per la maggior parte delle altre applicazioni
  • Mettere le parentesi attorno alle virgolette doppie attorno a tutti i valori è una schifezza
  • Mettere uno spazio prima di tutti i valori prima di mettere le virgolette doppie attorno ad essi impedisce la conversione in date, ma NON impedisce di tagliare gli zero iniziali o finali.
  • Mettere un singolo apice davanti a un valore funziona solo quando si inseriscono dati in Excel.

Tuttavia:

Mettere una tabulazione davanti a tutti i valori prima di mettere le doppie virgolette intorno ad essi impedisce la conversione in date e impedisce il taglio degli zeri iniziali o finali e il foglio non mostra nemmeno i brutti indicatori di avviso nell'angolo in alto a sinistra di ogni cella.

Es:

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

Notate che il carattere di tabulazione deve essere all'interno dei doppi apici. Modifica: si scopre che le doppie virgolette non sono nemmeno necessarie.

Un doppio clic sul file csv può aprire il file come un foglio di calcolo in Excel mostrando tutti i valori che sono trattati come appena sopra, come dati di testo. Assicuratevi di impostare Excel per usare il ‘.’ come 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 “Non il punto decimale” Valore separato.

22
22
22
2011-08-03 09:13:56 +0000

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

Si può trovare come DataGet External DataFrom Text in Excel 2007/2010.
Oppure DataImport External DataImport Data in Excel 2003.

Ecco un'immagine dell'Excel 2003 Text Import Wizard in azione sui dati di esempio forniti, che mi mostra l'importazione delle ultime due colonne come testo:

2
2
2
2013-01-13 22:37:27 +0000

L'esempio di Simon non ha funzionato per me, e sospetto che sia una differenza di lingua. 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", e non "=""VALUE""", che credo sia una convenzione di Visual Basic.

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

-2
-2
-2
2013-01-13 23:23:56 +0000

Un modo semplice per forzare Excel a interpretare la data come testo è mettere un singolo apice davanti alla data, invece di usare gli apici completi, come in:

‘10/11/2002

Se puoi importare il CSV invece di aprirlo, puoi dire a Excel che formato deve avere ogni colonna. Dai un'occhiata a questa domanda che ho fatto .