Come posso impostare Excel per importare sempre tutte le colonne di file CSV come testo?


68

Anche se provo ad evitarlo, ogni tanto devo aprire un file CSV in Excel. Quando lo faccio, formatta colonne contenenti numeri, il che li rende inutili per i miei scopi. Per quanto ne so, l'unico modo per evitare che ciò accada durante l'importazione è rinominare il file in modo che l'estensione non sia .csv e utilizzare la procedura guidata di importazione per specificare il formato di ciascuna colonna singolarmente. Per i file con 50-60 colonne, ciò non è pratico.

Poiché ogni risposta a questa frequente domanda su Internet suggerisce uno dei mezzi per riconvertire i numeri formattati una volta che il file è aperto (il che non funzionerà per me - voglio risolvere il problema generale, non alcuni casi specifici) o selezionando manualmente il tipo di formato di ogni colonna (cosa che non voglio fare), sto cercando un modo per impostare una preferenza o uno stile globale in modo tale che tutte le colonne di tutti i file CSV aperti siano sempre formattate come testo. So di "armare" anche i numeri con le virgolette, ma i file che ottengo non arrivano così e speravo di evitare di dover preelaborare i file in modo che Excel non li rovinasse.

Esiste un modo per farlo in modo specifico : formattare sempre tutte le colonne nei file CSV aperti come testo, senza selezionare manualmente ogni colonna ogni volta durante l'importazione?

Sto usando Excel 2003, ma prenderò le risposte per il 2007 se questo è quello che sai.


1
Hey Scripting Guy ha pubblicato un articolo sul blog sull'importazione di CSV in Excel che potrebbe avere qualche informazione utile per te. Giocare con l'oggetto dati all'interno di PowerShell può consentire di fare ciò che si desidera. Non pubblicato come risposta in quanto è essenzialmente solo un link esterno, ma potrebbe esserti utile.
Matrix Mole,

Risposte:


7

Questo funziona:

Sub OpenCsvAsText(ByVal strFilepath As String)

    Dim intFileNo As Integer
    Dim iCol As Long
    Dim nCol As Long
    Dim strLine As String
    Dim varColumnFormat As Variant
    Dim varTemp As Variant

    '// Read first line of file to figure out how many columns there are
    intFileNo = FreeFile()
    Open strFilepath For Input As #intFileNo
    Line Input #intFileNo, strLine
    Close #intFileNo
    varTemp = Split(strLine, ",")
    nCol = UBound(varTemp) + 1

    '// Prepare description of column format
    ReDim varColumnFormat(0 To nCol - 1)
    For iCol = 1 To nCol
        varColumnFormat(iCol - 1) = Array(iCol, xlTextFormat)
        ' What's this? See VBA help for OpenText method (FieldInfo argument).
    Next iCol

    '// Open the file using the specified column formats
    Workbooks.OpenText _
            Filename:=strFilepath, _
            DataType:=xlDelimited, _
            ConsecutiveDelimiter:=False, Comma:=True, _
            FieldInfo:=varColumnFormat

End Sub

Uso:

OpenCsvAsText "C:\MyDir\MyFile.txt"

Il file separato da virgole ora è aperto come foglio Excel con tutte le colonne formattate come testo.

Nota che la soluzione guidata di @ Wetmelon funziona bene, ma se stai aprendo molti file, potresti, come me, stancarti ogni volta, scorrendo fino alla colonna 60 per Shift-Click.

EDIT @GSerg afferma nel commento qui sotto che questo "non funziona" e "mangia spazi e zeri iniziali". Citerò solo il commento alla domanda, che è più descrittiva:

Per motivi sconosciuti, anche se si forniscono esplicitamente formati per tutte le colonne in VBA, Excel lo ignorerà se l'estensione del file è CSV. Non appena si modifica l'estensione, lo stesso codice produrrà i risultati corretti.

Quindi il codice sopra "funziona", ma viene ucciso da questo ridicolo comportamento di Excel. In qualunque modo lo tagli, sei bloccato a dover cambiare l'estensione in qualcosa di diverso da ".csv", scusa! Dopo di che, sei a casa gratis.


1
Non funziona Mangia spazi, mangia zeri
iniziali


1
Il metodo utilizzato Workbooks.OpenTextha i suoi difetti di progettazione (vedi la mia risposta di seguito). Usa QueryTablesinvece.
nixda,

71

Come aprire CSV in Excel

Buon modo

  • Excel → Dati → Ottieni dati esterni → Seleziona tutte le colonne con Shifte scegli Testo

    Upside: tratta tutti i valori correttamente come testo senza alcuna eccezione

    Unico inconveniente: più passaggi di un semplice doppio clic

Cattiva strada

  • Apri un CSV con un doppio clic o la finestra di dialogo Apri con Excel

    Unico inconveniente: il gestore CSV interno di Excel fraintende i valori con un segno iniziale -o un =segno come una formula anziché come testo

    Unico inconveniente: perderai zeri iniziali da valori binari come a 0001causa del formato di colonna rilevato automaticamente di Excel

Buon modo (per VBA)

  • Utilizzare le tabelle delle query (la controparte VBA per Get external data) → Codice di esempio

    Upside: tratta tutti i valori correttamente come testo senza alcuna eccezione

    Unico inconveniente: leggermente più codice del OpenTextmetodo

Modo sbagliato (per VBA)

  • Usa Workbooks.OpenTextmetodo → Esempio di codice

    Unico inconveniente: questo metodo utilizza ancora il gestore di importazione CSV interno di Excel con tutti i suoi difetti

    Unico inconveniente: inoltre, il fieldinfoparametro di OpenTextviene ignorato se l'estensione è CSV. Normalmente, questo parametro consente di scegliere ogni formato di colonna, ma non se l'estensione è CSV. Puoi leggere ulteriori informazioni su questo comportamento in Stack Overflow

    Rinominare temporaneamente l'estensione di origine da CSV a TXT e quindi tornare a CSV è una soluzione valida se si ha il controllo completo sul file di origine

Metodi aggiuntivi

  • Se hai accesso alla fonte che crea il tuo CSV, puoi modificare la sintassi del CSV.
    Racchiudere ogni valore tra virgolette doppie e aggiungere un segno di uguale come ="00001"o anteporre una scheda a ogni valore. Entrambi i modi costringono Excel a trattare il valore come testo

    Contenuto CSV originale
    inserisci qui la descrizione dell'immagine

    CSV in Excel quando aperto con doppio clic
    inserisci qui la descrizione dell'immagine

    Nota come la riga 2 (metodo di virgolette doppie) e la riga 3 (metodo di tabulazione) non vengono modificate da Excel

  • Apri CSV in Blocco note e copia e incolla tutti i valori in Excel. Quindi utilizza Dati - Testo in colonne
    : il testo in colonne per cambiare i formati delle colonne dal retro generale al testo produce risultati incoerenti. Se un valore contiene un -carattere circondato da caratteri (ad esempio "= E1-S1"), Excel prova a suddividere quel valore in più di una colonna. I valori che si trovano proprio su quella cella potrebbero essere sovrascritti

    (il comportamento del testo nelle colonne è stato modificato da qualche parte tra Excel 2007 e 2013, quindi non funziona più)


Componente aggiuntivo di Excel per aprire CSV e importare tutti i valori come testo

Questo è un plug-in Excel per semplificare le azioni di importazione CSV.
Il vantaggio principale: è una soluzione con un clic e utilizza QueryTableslo stesso metodo antiproiettile dietro Ottieni dati esterni

  • Aggiunge un nuovo comando di menu a Excel che consente di importare file CSV e TXT. Tutti i valori vengono importati nel foglio attivo a partire dalla cella attualmente selezionata
  • I componenti aggiuntivi di Excel sono disponibili per tutte le versioni di Office su Windows e Mac
  • L'intero componente aggiuntivo ha solo 35 righe di codice. Controlla il codice sorgente commentato se sei curioso
  • Il separatore di elenco CSV usato (virgola o punto e virgola) è tratto dalle impostazioni Excel locali
  • La codifica è impostata su UTF-8

Installazione

  1. Scarica il componente aggiuntivo e salvalo nella cartella dei componenti aggiuntivi:%appdata%\Microsoft\AddIns
  2. Apri Excel e attiva il componente aggiuntivo: File tab → Options → Add-Ins → Go Toe selezionaImportCSV.xla
  3. Abilita macro VBA: File tab → Options → Trust Center → Trust Center Settings → Macro Settings → Enable all macros
  4. Riavvia Excel

Noterai una nuova voce della barra dei menu chiamata Componenti aggiuntivi e utilizzerai questo pulsante per aprire rapidamente i tuoi file CSV senza passare attraverso il fastidio della finestra di dialogo Importa

inserisci qui la descrizione dell'immagine


Script di PowerShell per aprire CSV direttamente da Esplora risorse

È possibile utilizzare uno script PowerShell per aprire i file CSV e passarli automaticamente a Excel. Lo script utilizza silenziosamente il metodo di importazione del testo di Excel che tratta i valori sempre come testo e, come bonus, gestisce la codifica UTF-8

  1. Crea un nuovo file di testo e incolla lo script seguente. Una versione commentata è disponibile qui
$CSVs = @()
$args.ForEach({
    If ((Test-Path $_) -and ($_ -Match "\.csv$|\.txt$")) {
        $CSVs += ,$_
    } 
})

if (-Not $null -eq $CSVs) {

    $excel = New-Object -ComObject excel.application 
    $excel.visible = $true
    $excel.SheetsInNewWorkbook = $CSVs.Count    
    $workbook = $excel.Workbooks.Add()

    for ($i=0; $i -lt $CSVs.Count; $i++){

        $csv = Get-Item $CSVs[$i]
        $worksheet = $workbook.worksheets.Item($i + 1)
        $worksheet.Name = $csv.basename

        $TxtConnector = ("TEXT;" + $csv.fullname)
        $Connector = $worksheet.QueryTables.add($TxtConnector,$worksheet.Range("A1"))
        $query = $worksheet.QueryTables.item($Connector.name)
        $query.TextFilePlatform = 65001
        $query.TextFileTextQualifier = 1
        $query.TextFileOtherDelimiter = $Excel.Application.International(5) 
        $query.TextFileParseType  = 1
        $arrFormats = ,2 * $worksheet.Cells.Columns.Count
        $query.TextFileColumnDataTypes = $arrFormats
        $query.AdjustColumnWidth = 1
        $query.Refresh()
        $query.Delete()
    }
}
  1. Salvalo da qualche parte come C:\my\folder\myScript.ps1. (Nota l'estensione .ps1)
    • Apri la tua cartella sendto tramite WinR» shell:sendto» Enter
  2. Crea un nuovo collegamento con il tasto destro del mouse »Nuovo» Collegamento e incolla questa linea. Non dimenticare di cambiare il percorso del tuo percorso in cui hai inserito la sceneggiatura. Denominare il collegamento, ad esempio Excel

"% SystemRoot% \ system32 \ WindowsPowerShell \ v1.0 \ powershell.exe" -NoProfile -NonInteractive -WindowStyle Hidden -File "C: \ my \ folder \ myScript.ps1"

Ora puoi selezionare (più) CSV e aprirli in Excel tramite Right-click » SendTo » Excel


1
Il componente aggiuntivo è stato testato con Office 2003 e 2013
nixda,

Il miglior "modo migliore" è esattamente quello di cui avevo bisogno per un'importazione unica. Non c'è bisogno di pasticciare con VBA e può persino controllare quali colonne sono prese come data / numeri (con il resto preso come testo). Avrei voluto che Excel si offrisse di aprire questa procedura guidata di importazione facendo doppio clic su CSV.
ADTC

@Vadzim Ciao, apprezzo il tuo sforzo per correggere i collegamenti non funzionanti. Infatti ge.tt presenta alcuni problemi negli ultimi mesi. Ma penso di aver risolto tutti i problemi e che i vecchi link originali dovessero funzionare di nuovo. Non so perché Google Chrome avvisa prima di scaricare qualcosa da ge.tt. Ma tutti gli altri browser funzionano normalmente e ti posso assicurare che non sono malware
nixda

@nixda, grazie per aver rianimato i link e per l'ottima risposta
Vadzim,

@nixda I collegamenti a ge.tt vengono nuovamente interrotti. La maggior parte afferma di non essere disponibile perché il proprietario ha violato il TOS. Tuttavia, quello per OpenCSV.exe dice "Questi file non sono più disponibili poiché hanno violato i termini di servizio." Il che mi porta a chiedere: sei l'autore della funzione ImportMyCSV Excel? (sourcecode è ancora disponibile su pastebin) Questo è uno strumento fantastico - lo uso al lavoro e l'ho consigliato ad altri. Ma sono interessato all'origine del codice, se non altro, per accreditare correttamente l'autore.
GlennFromIowa,

5

Puoi provare aprendo prima un .xlsx, quindi creando una connessione dati e importando il .csv. Seleziona delimitato da "virgola", quindi seleziona l'opzione per trattare tutte le colonne come testo anziché "Generale".

Modifica: Oh, non ho letto completamente la domanda. Nella procedura guidata di importazione, seleziona la prima intestazione di colonna che desideri importare come testo, scorri fino all'intestazione di colonna finale e Maiusc + clic sull'intestazione. Quindi selezionare l'opzione "Testo" radiale.


2
Sì, funziona bene, purché l'estensione del file non sia ".csv". +1
Jean-François Corbett,

4

Il suggerimento di Wetmelon funziona (anche con .CSV) se si procede come segue:

  1. Apri Excel in una cartella di lavoro o foglio di lavoro vuota
  2. Fare clic su Dati> [Ottieni dati esterni] dal testo
  3. Utilizzare "Importazione guidata testo" come descrive Wetmelon (delimitato da virgole, selezionare la prima colonna, MAIUSC + CLIC sull'ultima colonna, impostare tutto su Testo).

So che sono più passaggi, ma almeno mi consente di aprire CSV in questo modo senza dover modificare l'estensione


2

Attento!

Quando si utilizza il metodo manuale "Excel → Dati → Ottieni dati esterni → Seleziona tutte le colonne e scegli Testo" ......

Ciò imposterà le colonne solo sul testo "che hanno dati nella prima riga" (in genere una riga di intestazione). Questa procedura guidata non mostra le colonne più a destra che potrebbero contenere dati più in basso ma non nella prima riga. Per esempio:

Row1Col1, Row1Col2, Row1Col3

Row2Col1, Row2Col2, Row2Col3, Row2Col4

Non vedrai mai Col 4 nella procedura guidata di importazione, quindi non avrai la possibilità di cambiarlo dal formato generale a quello del testo prima dell'importazione !!!!


1
Un buon avvertimento, dal 99.9999% delle volte, le persone non scorrono verso il basso nella procedura guidata di importazione e anche in questo caso è difficile catturare tutte le colonne. Tuttavia, tecnicamente, puoi scorrere verso il basso mentre sei nella procedura guidata di importazione e catturare colonne aggiuntive che non hanno dati nella prima riga.
GlennFromIowa

1

Ecco la procedura alternativa al codice pubblicato sopra da Jean-François Corbett

Questa procedura importerà il file CSV in Excel con tutte le colonne formattate come testo

Public Sub ImportCSVAsText()
    Dim TempWorkbook As Workbook
    Dim TempWorksheet As Worksheet
    Dim ColumnCount As Integer
    Dim FileName As Variant
    Dim ColumnArray() As Integer

    'Get the file name
    FileName = Application.GetOpenFilename(FileFilter:="All Files (*.*),*.*", FilterIndex:=1, Title:="Select the CSV file", MultiSelect:=False)

    If FileName = False Then Exit Sub

    Application.ScreenUpdating = False

    'Open the file temporarily to get the count of columns
    Set TempWorkbook = Workbooks.Open(FileName)
    ColumnCount = TempWorkbook.Sheets(1).Range("A1").SpecialCells(xlCellTypeLastCell).Column
    TempWorkbook.Close SaveChanges:=False

    'Resize the array to number of columns
    ReDim ColumnArray(1 To ColumnCount)

    For i = 1 To ColumnCount
        ColumnArray(i) = xlTextFormat
    Next i

    Set TempWorkbook = Workbooks.Add
    Set TempWorksheet = TempWorkbook.Sheets(1)

    Application.DisplayAlerts = False
    TempWorkbook.Sheets(2).Delete
    TempWorkbook.Sheets(2).Delete
    Application.DisplayAlerts = True

    With TempWorksheet.QueryTables.Add("TEXT;" & FileName, TempWorksheet.Cells(1, 1))
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 1251
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = False
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = True
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = ColumnArray
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With

End Sub

Benvenuto in SuperUser, invece di aggiungere una nuova risposta, dovresti aver modificato la risposta di Corbett e migliorarla. Mi rendo conto che non hai ancora abbastanza reputazione per farlo, ma potresti collegare le tue modifiche nei commenti dove gli chiedi di leggerlo.
Vlastimil Ovčáčík il

0

Se si importano sempre gli stessi dati (formato record costante, layout, ecc ...) è possibile scrivere una macro di Access utilizzando una specifica di importazione e quindi scaricare i dati in Excel. Fatto questo potrebbe volte. L'altro modo in cui l'ho fatto è usare VBA e leggere i dati nel foglio di lavoro un record alla volta e analizzarli durante la lettura. Per quanto ne so non c'è modo di impostare un formato predefinito durante l'importazione in Excel e anche se ciò potesse causare problemi con il tipo di file successivo che si tenta di analizzare.


1
Ecco il punto: non sto provando a fare alcuna analisi se non per inserire la stringa di testo che era tra le virgole in colonne durante l'importazione. Se ho bisogno che sia formattato in un certo modo, posso farlo (come creare date di stringhe di date, ecc.), Ma ho solo bisogno che i dati vengano lasciati soli inizialmente. Perché dovrebbe essere così difficile?
William Gunn,

0

Come richiesta, inviando il mio commento come risposta (con un po 'più di informazioni aggiunte):

Hey Scripting Guy ha pubblicato un articolo sul blog sull'importazione di CSV in Excel che potrebbe avere qualche informazione utile per te. Giocare con l'oggetto dati all'interno di PowerShell può consentire di fare ciò che si desidera.

Sebbene l'articolo menzioni specificamente l'importazione dei dati nelle celle che potrebbero lasciare il formato numerico, potrebbe essere possibile giocare con alcune delle proprietà e dei metodi ComObject di Excel per forzare i dati a immettere le celle come testo non elaborato (o forzare la formattazione delle celle in testo prima o dopo l'importazione).


0

Per motivi sconosciuti, anche se si forniscono esplicitamente formati per tutte le colonne, Excel lo ignorerà se l'estensione del file è CSV.

Alcune opzioni:

  • Crea una query per importare i dati, come suggerisce Wetmelon .
    Svantaggio: potrebbero mancare i driver del database CSV su un computer a 64 bit.

  • Usa il codice di Jean , ma incorpora la copia del file in una cartella temporanea e la modifica dell'estensione della copia.
    Svantaggio: nessun collegamento al file originale (il salvataggio sovrascriverà la copia); successivamente dovrai eliminare manualmente la copia. Tuttavia, puoi salvare manualmente come sul CSV originale.

  • Aprire il CSV in Blocco note, Ctrl+A, Ctrl+C, incollare in Excel, quindi dati - Testo in colonne, allora è la solita procedura guidata in cui è possibile impostare tutte le colonne di testo in una sola volta. È un sapore diverso rispetto all'opzione precedente, perché nasconde anche la preziosa estensione da Excel.
    Svantaggio: manuale.

  • Avere un ciclo VBA molto semplice che legge l'intero file in memoria e lo mette sul foglio, cella per cella.
    Svantaggio: più lento, brutto.


"Nessun collegamento al file [CSV] originale" non è uno svantaggio di tutti questi metodi? Mi piace l'idea di copiare in una cartella temporanea e modificare l'estensione lì ... Potrebbe persino sovrascrivere l'originale (come CSV) non appena la copia è aperta.
Jean-François Corbett,

@ Jean-FrançoisCorbett, utilizzo sempre l'Importazione guidata per importare file .csv con estensione csv in Excel 2010. Specifico esplicitamente il formato delle colonne come Testo e mantiene il formato della cella come testo. Forse questo era un problema con le versioni precedenti di Excel?
GlennFromIowa

-2

Se capisco correttamente la domanda, questo può essere facilmente risolto usando l'opzione Transpose in Paste-Special come descritto qui .

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.