Excel'i her zaman CSV dosyalarının tüm sütunlarını Metin olarak içe aktaracak şekilde nasıl ayarlayabilirim?


68

Bundan kaçınmaya çalışsam da, zaman zaman Excel'de bir CSV dosyasını açmam gerekiyor. Yaptığımda, sayıları içeren sütunları biçimlendirir, bu da amaçlarım için onları gereksiz kılar. Söyleyebileceğim kadarıyla, bunun içe aktarmada gerçekleşmesini engellemenin tek yolu , dosyayı .csv olmayacak şekilde yeniden adlandırmak ve her sütunun biçimini ayrı ayrı belirtmek için içe aktarma sihirbazını kullanmak. 50-60 sütunlu dosyalar için bu pratik değildir.

İnternette bu sık sorulan soruya verilen her cevap, dosya açıldığında biçimlendirilmiş sayıları geri dönüştürmenin bir yolunu önerdiğinden (bu benim için işe yaramaz - genel sorunu çözmek istiyorum, birkaç özel durumu çözmek istiyorum) veya her sütunun biçim türünü elle seçmek (ki bunu yapmak istemiyorum), açılan tüm CSV dosyalarının tüm sütunlarının her zaman metin olarak biçimlendirileceği şekilde genel bir tercih veya stil belirlemenin bir yolunu arıyorum. Rakamlarla sayıları "zırhlama" hakkında da bilgim var, ancak aldığım dosyalar böyle gelmiyor ve Excel'in onları mahvetmemesi için dosyaları önceden işlemekten kaçınmayı umuyordum.

Bunu özellikle yapmanın bir yolu var mı : Açık CSV dosyalarındaki tüm sütunları içe aktarma sırasında her seferinde her sütunu manuel olarak seçmeden her zaman metin olarak biçimlendirmek mi istiyorsunuz?

Excel 2003 kullanıyorum, ancak bildiğiniz buysa, 2007 için cevapları alıyorum.


1
Hey Scripting Guy, CSV’yi Excel’e İçe Aktarma hakkında , sizin için bazı yararlı bilgiler barındırabilecek bir blog makalesi yaptı . Powershell içindeki data nesnesiyle oynamak, istediğiniz şeyi yapmanıza izin verebilir. Aslında bir site dışı bağlantı olduğu için cevap olarak yayınlanmadı, ancak sizin için bir yararı olabilir.
Matrix Mole,

Yanıtlar:


7

Bu çalışıyor:

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

Kullanımı:

OpenCsvAsText "C:\MyDir\MyFile.txt"

Virgülle ayrılmış dosya şimdi tüm sütunlar metin olarak biçimlendirilmiş olarak Excel sayfası olarak açılmıştır.

@ Wetmelon'un sihirbaz çözümünün gayet iyi çalıştığını unutmayın, ancak çok sayıda dosya açıyorsanız, o zaman, benim gibi, her seferinde, Shift-Click yapmak için sütun 60'a ilerleyerek yorgunluk duyabilirsiniz.

EDIT @GSerg, aşağıdaki yorumda, bu "işe yaramadığını" ve "boşlukları yediğini ve sıfırları yolladığını" belirtir. Ben sadece yorum daha açıklayıcı olan soruya alıntı yapacağım:

Bilinmeyen nedenlerden dolayı, VBA'daki tüm sütunlar için açıkça biçimler sağlasanız bile, dosya uzantısı CSV ise Excel bunu dikkate almaz. Uzantıyı değiştirir değiştirmez aynı kod doğru sonuçları verecektir.

Bu yüzden yukarıdaki kod "işe yarıyor", ama bu saçma Excel davranışı tarafından öldürülüyor. Hangi yolu kestiyseniz, uzantıyı ".csv" dışında bir şeye değiştirmek zorunda kaldınız, üzgünüm! Ondan sonra, evde özgürsün.


1
Çalışmıyor
Mekanları


1
Kullanılan yöntemin Workbooks.OpenTextkusurları tasarım gereğidir (Aşağıdaki cevaba bakınız). Yerine QueryTableskullanın.
nixda

71

Excel'de CSV'ler nasıl açılır

İyi bir yol

  • Excel → Veri → Dış veri al → Tüm sütunları seç Shiftve Metin

    Upside: Tüm değerleri istisnasız olarak metin olarak doğru şekilde işler

    Dezavantajı: Basit bir çift ​​tıklatmadan daha fazla adım

Kötü yol

  • Çift Tıklama veya Excel'in iletişim kutusuyla açarak bir CSV açın

    Dezavantajı: Excel'in dahili CSV işleyicisi, değerleri bir satır başı -ya da =işaretiyle metin yerine formül olarak yanlış yorumluyor

    Dezavantajı: 0001Excel'in otomatik olarak algılanan sütun formatı gibi ikili değerlerden baştaki sıfırları kaybedeceksiniz

İyi yol (VBA için)

  • QueryTable'ları kullanın (VBA karşılığı Get external data) → Örnek kod

    Upside: Tüm değerleri istisnasız olarak metin olarak doğru şekilde işler

    Dezavantajı: OpenTextYöntemden biraz daha fazla kod

Kötü yol (VBA için)

  • Workbooks.OpenTextYöntemini kullanın → Örnek kod

    Dezavantajı: Bu yöntem hala Excel'in dahili CSV içe aktarma işleyicisini tüm kusurlarıyla birlikte kullanıyor

    Olumsuz: Ek olarak, eğer uzantı CSV ise fieldinfoparametresi OpenTextyoksayılır. Normalde, bu parametre her sütun formatını seçmenize izin verir, fakat eğer uzantı CSV ise. Bu davranışla ilgili daha fazla bilgiyi Stack Overflow'ta okuyabilirsiniz.

    Kaynak dosya üzerinde tam kontrolünüz varsa, kaynak uzantıyı CSV'den TXT'ye ve ardından CSV'ye geçici olarak yeniden adlandırmak geçerli bir geçici çözümdür.

Ek yöntemler

  • CSV'nizi yaratan kaynağa erişiminiz varsa, CSV sözdizimini değiştirebilirsiniz.
    Her değeri çift tırnak işareti içine alın ve her değer için ="00001"bir sekme benzeri bir işaret veya ön ek işareti ekleyin. Her iki yol da Excel'i, değeri metin olarak kabul etmeye zorlar

    Orijinal CSV içeriği
    görüntü tanımını buraya girin

    Çift tıklamayla açıldığında Excel'de CSV
    görüntü tanımını buraya girin

    Satır 2'nin (çift alıntı yöntemi) ve satır 3'ün (sekme yöntemi) Excel tarafından nasıl değiştirilmediğini unutmayın.

  • CSV'yi Not Defteri'nde açın ve tüm değerleri Excel'e kopyalayıp yapıştırın. Ardından Aşağıdan Aşağıya Sütunlara Veri - Metin kullanın
    : Sütun formatlarını genelden metne değiştirmek için Sütunlardaki Metin tutarsız sonuçlar verir. Bir değer -çevrili bir karakter içeriyorsa (örneğin "= E1-S1"), Excel bu değeri birden fazla sütuna bölmeye çalışır. Bu hücreye yerleştirilen değerler üzerine yazılabilir

    ( Metinlerin sütunlara davranışı Excel 2007 ile 2013 arasında bir yerlerde değiştirildi, böylece artık çalışmıyor)


CSV'leri açmak ve tüm değerleri metin olarak içe aktarmak için Excel Eklentisi

Bu, CSV İçe Aktarma işlemlerini basitleştirmek için bir Excel Eklentisidir.
Ana avantajı: Tek tıklamayla bir çözüm ve kullanım QueryTables, arkasındaki aynı kurşun geçirmez yöntem Dış veri al

  • CSV ve TXT dosyalarını içe aktarmanıza izin veren Excel'e yeni bir menü komutu ekler. Tüm değerler seçili hücreden başlayarak etkin sayfaya alınır
  • Excel Eklentisi, Windows ve Mac'teki tüm Office sürümleri için kullanılabilir
  • Tüm Eklenti yalnızca 35 kod satırına sahiptir. Merak ediyorsanız yorumlanmış kaynak kodunu kontrol edin.
  • Kullanılan CSV liste ayırıcısı (virgül veya noktalı virgül) yerel Excel ayarlarınızdan alınır.
  • Kodlama UTF-8 olarak ayarlandı

Kurulum

  1. İndir Eklenti In ve Eklentiler klasöre kaydedin:%appdata%\Microsoft\AddIns
  2. Açık Excel ve Ekle-In aktive: File tab → Options → Add-Ins → Go TobasıpImportCSV.xla
  3. VBA makrolarını etkinleştir: File tab → Options → Trust Center → Trust Center Settings → Macro Settings → Enable all macros
  4. Excel'i yeniden başlatın

Eklentiler adında yeni bir menü çubuğu girişi fark edeceksiniz ve bu düğmeyi CSV dosyalarınızı İçe Aktar iletişim kutusunun sıkıntısını çekmeden hızlıca açmak için kullanıyorsunuz.

görüntü tanımını buraya girin


CSV'leri doğrudan Windows Gezgini'nden açmak için PowerShell betiği

CSV dosyalarını açmak ve otomatik olarak Excel'e aktarmak için PowerShell betiğini kullanabilirsiniz. Betik sessizce Excel'in değerleri her zaman metin olarak kabul eden ve bonus olarak UTF-8 kodlamasını işleyen metin alma yöntemini kullanır

  1. Yeni bir metin dosyası oluşturun ve aşağıdaki betiği yapıştırın. Yorumlu bir sürüm burada bulunabilir
$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. Gibi bir yere sakla C:\my\folder\myScript.ps1. (Uzantıya dikkat edin .ps1)
    • Sendto klasörünüzü WinR» shell:sendto» ile açın Enter
  2. Yeni bir kısayol oluşturun »Sağ» Yeni »Kısayol'a tıklayın ve bu satırı yapıştırın. Yolu, kendi betiğinizi koyduğunuz yere değiştirmeyi unutmayın. Kısayolu adlandırın, örneğin, Excel

"% SystemRoot% \ system32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "

Şimdi (birden fazla) CSV seçebilir ve bunları Excel’de Excel’de açabilirsiniz. Right-click » SendTo » Excel


1
Eklenti, Office 2003 ve 2013 ile test edildi
nixda

En iyi "En İyi Yol", bir kereye mahsus ithalat için tam olarak ihtiyacım olan şeydi. VBA ile uğraşmanıza gerek yok ve hangi sütunların tarih / sayı olarak alınacağını bile kontrol edebilirsiniz (gerisi metin olarak alınır). Excel’in, CSV’yi çift tıkladığınızda bu içe aktarma sihirbazını açmasını önereceğini umuyorum.
ADTC

@ Valzim Merhaba, ölü bağlantıları düzeltmek için gösterdiğiniz çaba için teşekkür ederim. Nitekim ge.tt son aylarda bazı problemler çıkarır. Ancak tüm sorunları düzelttiğimi ve eski orijinal bağlantıların yeniden çalışması gerektiğini düşünüyorum. Google Chrome’un ge.tt’den bir şey indirmeden önce neden uyardığını bilmiyorum. Ancak diğer tüm tarayıcılar normal çalışıyor ve size kötü amaçlı yazılım olmadıklarını temin ederim
nixda

@nixda, bağlantıları canlandırdığınız ve büyük cevaplar için teşekkür ederiz
Vadzim

@ nixda ge.tt ile olan bağlantılar tekrar koptu. Çoğu, işletme sahibi TOS'u ihlal ettiği için uygun olmadığını söylüyor . Ancak, OpenCSV.exe dosyası için bir "Bu dosyalar artık hizmet şartlarını ihlal ettiği için kullanılamıyor " diyor . Bana sormamı sağlayan şey, ImportMyCSV Excel fonksiyonunun yazarı siz misiniz? (sourcecode pastebin'de hala kullanılabilir) Bu harika bir araçtır - İşyerinde kullanıyorum ve başkalarına tavsiye ettim. Ancak, yazarın düzgün bir şekilde kredilendirilmesi için başka bir şey yoksa, kodun kökeni ile ilgileniyorum.
GlennFromIowa

5

Önce bir .xlsx açıp ardından bir veri bağlantısı oluşturarak ve .csv dosyasını içe aktararak deneyebilirsiniz. Sınırlandırılmış "virgül" seçeneğini seçin, ardından tüm sütunlara "Genel" yerine metin olarak bakma seçeneğini seçin.

Düzenleme: Ah, soruyu tam olarak okumadım. Alma sihirbazında, metin olarak içe aktarmak istediğiniz ilk sütun başlığını seçin, son sütun başlığına gidin ve Shift + Başlığı tıklayın. Sonra "Metin" radyal seçeneğini seçin.


2
Evet, bu iyi çalışıyor - dosyanın uzantısı ".csv" olmadığı sürece. +1
Jean-François Corbett

4

Wetmelon'un önerisi, aşağıdakileri yaparsanız çalışır (.CSV ile bile):

  1. Excel'i boş bir çalışma kitabına veya çalışma sayfasına açma
  2. Veriye Tıkla> [Dış Veri Al] Metinden
  3. Wetmelon'un açıkladığı gibi "Metin Alma Sihirbazı" nı kullanın (Virgülle ayrılmış, ilk sütunu seçin, ÜSTKRKT + son sütunu tıklayın, her şeyi Metin olarak ayarlayın).

Daha fazla adım olduğunu biliyorum, ancak en azından uzantıyı değiştirmek zorunda kalmadan CSV'leri bu şekilde açmama izin veriyor


2

Dikkat et!

Manüel yöntemi kullanırken "Excel → Veri → Dış veri al → Tüm sütunları seç ve Metin seç" ......

Bu, sütunları yalnızca "ilk satırda verileri olan" metnine ayarlar (genellikle bir başlık satırı). Bu sihirbaz, size daha ileride olan ancak ilk satırda olmayan verilerde bulunabilecek sağdaki sütunları göstermez. Örneğin:

Row1Col1, Row1Col2, Row1Col3

Row2Col1, Row2Col2, Row2Col3, Row2Col4

İçe aktarma sihirbazında Col 4'ü asla görmezsiniz, bu nedenle içe aktarmadan önce genelden metin biçimine geçirme seçeneğiniz olmaz. !!!!


1
İyi bir uyarı, zamanın% 99.9999'undan beri, insanlar içe aktarma sihirbazında aşağı kaymaz ve o zaman bile tüm sütunları yakalamak zordur. Ancak, teknik olarak Alma sihirbazındayken aşağı kayabilir ve ilk satırda veri içermeyen ek sütunlar yakalayabilirsiniz.
GlennFromIowa'dan 14.07

1

Yukarıda Jean-François Corbett tarafından yayınlanan kod için alternatif prosedür

Bu Prosedür, csv dosyasını Excel'e, tüm sütunlar Metin olarak biçimlendirilmiş olarak içe aktarır.

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

SuperUser'a hoş geldiniz, yeni bir cevap eklemek yerine, Corbett'in cevabını düzenlemeli ve iyileştirmelisiniz. Bunu yapmak için henüz yeterli bir üne sahip olmadığınızın farkındayım, ancak değişikliklerinizi yorum yazıp onu okumasını istediğiniz yere bağlayabilirsiniz.
Vlastimil Ovčáčík

0

Her zaman aynı verileri alıyorsanız (sabit kayıt formatı, düzen vb.) Bir içe aktarma belirtimi kullanarak bir Access makrosu yazabilir ve ardından verileri Excel'e geri gönderebilirsiniz. Bunu birkaç kez yaptım. Bunu yapmamın diğer yolu da VBA'yı kullanmak ve verileri çalışma sayfasına bir kerede bir kayıt okumak ve okuduğu şekilde ayrıştırmaktır. Bildiğim kadarıyla, Excel'de içe aktarma sırasında varsayılan bir biçim belirlemenin bir yolu yoktur ve bunu yapsanız bile, ayrıştırmayı denediğiniz bir sonraki dosya türüyle ilgili sorunlara neden olabilir.


1
İşte mesele - Aldığımda virgüllerin arasındaki metin dizesini sütunlara koymak dışında herhangi bir ayrıştırma yapmaya çalışmıyorum. Belli bir şekilde biçimlendirilmesine ihtiyacım olursa, o zaman bunu yapabilirim (tarih dizgileri tarihleri, vb. Yapmak gibi), ancak başlangıçta yalnız bırakılan verilere ihtiyacım var. Bu neden bu kadar zor olmalı?
William Gunn

0

İstek olarak, yorumumu bir cevap olarak gönderme (biraz daha fazla bilgi eklenmiş olarak):

Hey Scripting Guy, CSV’yi Excel’e İçe Aktarma hakkında , sizin için bazı yararlı bilgiler barındırabilecek bir blog makalesi yaptı . Powershell içindeki data nesnesiyle oynamak, istediğiniz şeyi yapmanıza izin verebilir.

Her ne kadar makale özellikle sadece veriyi sayı formatı bırakabilecek hücrelere ithal etmekten bahsediyor olsa da, bazı verileri Excel ComObject özellikleri ve hücrelerin yerine ham metin olarak girmeye zorlamak için metotlarla oynamak mümkün olabilir (veya zorlamak için). hücrelerin içe aktarılmasından önce veya sonra metne dönüştürülmesi).


0

Bilinmeyen nedenlerden dolayı, tüm sütunlar için açıkça formatlar sağlasanız bile, dosya uzantısı CSV ise Excel bunu dikkate almaz.

Bazı seçenekler:

  • Wetmelon'un önerdiği gibi verileri almak için bir sorgu oluşturun .
    Dezavantaj: 64 bit bir makinede CSV veritabanı sürücülerini eksik olabilir.

  • Jean'in kodunu kullanın , ancak dosyayı geçici bir klasöre kopyalayın ve kopyanın uzantısını değiştirin.
    Dezavantaj: Orijinal dosyaya bağlantı yok (kaydetme kopyanın üzerine yazacaktır); daha sonra kopyayı el ile silmeniz gerekir. Yine de, orijinal CSV üzerinden Farklı Kaydet'i elle yapabilirsiniz.

  • , Not Defteri'nde CSV açın Ctrl+A, Ctrl+C, Excel, daha sonra Veri yapıştırmak - Sütunlara Metin, o zaman tek seferde Metin Tüm sütunları ayarlayabilirsiniz zamanki büyücü. Önceki seçeneğin farklı bir lezzetidir, çünkü Excel'in değerli uzantısını da gizler.
    Dezavantaj: manuel.

  • Tüm dosyayı belleğe okuyan ve hücreye hücre içine yerleştiren çok basit bir VBA döngüsüne sahip olun.
    Dezavantaj: daha yavaş, çirkin.


"Orijinal [CSV] dosyasına bağlantı yok" tüm bu yöntemlerin bir dezavantajı değil midir? Bir geçici klasöre kopyalama ve orada uzantıyı değiştirme fikrini seviyorum ... Kopyalama açılır açılmaz orijinalin (CSV olarak) üzerine bile yazılabilir.
Jean-François Corbett

@ Jean-FrançoisCorbett, csv uzantılı Excel. 2010'a .csv dosyalarını almak için her zaman Alma Sihirbazı'nı kullanırım. Sütunların biçimini Metin olarak açıkça belirtirim ve hücre biçimini metin olarak tutar. Belki de bu, Excel'in eski sürümleriyle ilgili bir sorundur?
GlennFromIowa'dan 14.07

-2

Soruyu doğru anlarsam, burada açıklandığı gibi Özel Yapıştır'daki Transpose seçeneği kullanılarak bu kolayca çözülebilir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.