CSV 파일의 모든 열을 항상 텍스트로 가져 오도록 Excel을 설정하려면 어떻게해야합니까?


68

나는 그것을 피하려고 노력하지만 때로는 Excel에서 CSV 파일을 열어야합니다. 내가 할 때 숫자가 포함 된 열의 형식을 지정하므로 내 목적에 쓸모가 없습니다. 내가 알 수있는 한, 가져올 때 이것이 발생하는 것을 막는 유일한 방법 은 파일 이름을 바꾸어 확장자가 .csv가 아니고 가져 오기 마법사를 사용하여 각 열의 형식을 개별적으로 지정하는 것입니다. 열이 50-60 인 파일의 경우 비실용적입니다.

인터넷 에서이 자주 묻는 질문에 대한 모든 대답은 파일이 열리면 서식이 지정된 숫자를 다시 변환하는 몇 가지 방법을 제안하기 때문에 (나에게 효과적이지 않습니다-몇 가지 구체적인 경우가 아니라 일반적인 문제를 해결하고 싶습니다) 또는 원하지 않는 각 열의 형식 유형을 수동으로 선택하는 경우 열린 모든 CSV 파일의 모든 열이 항상 텍스트 형식으로 설정되도록 전역 환경 설정 또는 스타일을 설정하는 방법을 찾고 있습니다. 나는 따옴표로 숫자를 "armoring"하는 것에 대해 알고 있지만, 얻는 파일은 그렇게 나오지 않으며 Excel에서 파일을 망치지 않도록 파일을 사전 처리하지 않기를 바랐습니다.

구체적 으로 수행 할 수있는 방법이 있습니까 : 가져 오는 동안 매번 수동으로 각 열을 선택하지 않고 열린 CSV 파일의 모든 열을 텍스트로 항상 형식화합니까?

Excel 2003을 사용하고 있지만 2007 년에 답변을 드리겠습니다.


1
Hey Scripting Guy는 유용한 정보를 얻을 수있는 Excel로 CSV 가져 오기 에 대한 블로그 기사 를 작성했습니다. Powershell 내부의 데이터 객체를 사용하면 원하는 작업을 수행 할 수 있습니다. 본질적으로 오프 사이트 링크 일 뿐이므로 답변으로 게시되지는 않지만 유용한 정보가 될 수 있습니다.
Matrix Mole

답변:


7

이것은 작동합니다 :

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

용법:

OpenCsvAsText "C:\MyDir\MyFile.txt"

쉼표로 구분 된 파일은 이제 텍스트로 형식화 된 모든 열이있는 Excel 시트로 열립니다.

@Wetmelon의 마법사 솔루션은 잘 작동하지만 많은 파일을 열면 나와 같이 피곤할 때마다 60 열로 스크롤하여 Shift 키를 누른 상태로 클릭하십시오.

편집 @GSerg이 "가 작동하지 않습니다"과 "공간과 선행 0을 먹는다"고 코멘트 아래에 나와 있습니다. 질문에 대한 의견을 인용하면 더 설명이 좋습니다.

알 수없는 이유로 VBA의 모든 열에 대해 형식을 명시 적으로 제공하더라도 파일 확장자가 CSV 인 경우 Excel에서 해당 형식을 무시합니다. 확장명을 변경하자마자 동일한 코드로 올바른 결과를 얻을 수 있습니다.

따라서 위의 코드는 "작동"하지만이 우스운 Excel 동작에 의해 종료됩니다. 어떤 방법으로 잘라 든 확장명을 ".csv"이외의 이름으로 변경해야합니다. 죄송합니다. 그 후, 당신은 집에 무료입니다.


1
작동하지 않습니다. 스페이스와 선행 0 등을 먹는다
GSerg


1
사용 된 방법 Workbooks.OpenText에는 의도적으로 결함이 있습니다 (아래 답변 참조). QueryTables대신 사용하십시오 .
nixda

71

Excel에서 CSV를 여는 방법

좋은 방법

  • Excel → 데이터 → 외부 데이터 가져 오기 →로 모든 열을 Shift선택하고 텍스트를 선택하십시오.

    거꾸로 : 예외없이 모든 값을 텍스트로 올바르게 처리

    단점 : 단순한 더블 클릭 보다 더 많은 단계

나쁜 방법

  • 더블 클릭 또는 Excel의 대화 상자로 열기로 CSV 열기

    단점 : Excel의 내부 CSV 처리기 는 텍스트가 아닌 수식으로 선행 -또는 =부호 가있는 값을 잘못 해석합니다.

    단점 : 0001Excel의 자동 감지 열 형식으로 인해 이진 값에서 선행 0이 손실 됩니다.

좋은 방법 (VBA의 경우)

  • QueryTables 사용 (VBA 대응 Get external data) → 예제 코드

    거꾸로 : 예외없이 모든 값을 텍스트로 올바르게 처리

    단점 : OpenText방법 보다 약간 더 많은 코드

나쁜 길 (VBA의 경우)

  • 사용 Workbooks.OpenText방법 → 예제 코드

    단점 :이 방법은 여전히 ​​모든 결함과 함께 Excel의 내부 CSV 가져 오기 핸들러를 사용하고 있습니다.

    단점 : 또한 확장명이 CSV 인 경우 fieldinfo매개 변수 OpenText는 무시됩니다. 일반적으로이 매개 변수를 사용하면 모든 열 형식을 선택할 수 있지만 확장자가 CSV 인 경우는 아닙니다. 스택 오버플로 에서이 동작에 대해 자세히 읽을 수 있습니다.

    소스 파일을 완전히 제어 할 수있는 경우 소스 확장명을 CSV에서 TXT로 변경 한 다음 CSV로 다시 변경하는 것이 유효한 해결 방법입니다.

추가 방법

  • CSV를 생성하는 소스에 액세스 할 수 있으면 CSV 구문을 변경할 수 있습니다.
    모든 값을 큰 따옴표로 묶고 ="00001"모든 값 앞에 탭을 추가하거나 앞에 붙는 등호를 붙 입니다. 두 가지 방법 모두 Excel에서 값을 텍스트로 처리하도록합니다.

    원본 CSV 컨텐츠
    여기에 이미지 설명을 입력하십시오

    더블 클릭을 통해 열면 Excel의 CSV
    여기에 이미지 설명을 입력하십시오

    Excel에서 줄 2 (큰 따옴표 방법)와 줄 3 (탭 방법)이 변경되지 않는 방법에 유의하십시오.

  • 메모장 에서 CSV를 열고 모든 값을 Excel에 복사하여 붙여 넣습니다. 그런 다음 사용하는 텍스트 나누기 - 데이터
    : 단점 텍스트 열에서 다시 텍스트가 일치하지 않는 결과를 얻을 수에 일반에서 열 형식을 변경. 값 -에 문자 로 둘러싸인 문자 (예 : "= E1-S1")가 있으면 Excel은 해당 값을 둘 이상의 열로 분할하려고합니다. 해당 셀에있는 값을 덮어 쓸 수 있습니다

    ( 텍스트의 열 동작은 Excel 2007과 2013 사이에서 변경되어 더 이상 작동하지 않음)


CSV를 열고 모든 값을 텍스트로 가져 오는 Excel 추가 기능

CSV 가져 오기 작업을 단순화하기위한 Excel 플러그인입니다.
주요 장점 : 원 클릭 솔루션이며 외부 데이터 가져QueryTables 오기와 동일한 방탄 방법을 사용 합니다.

  • Excel에 새로운 메뉴 명령을 추가하여 CSV 및 TXT 파일을 가져올 수 있습니다. 현재 선택된 셀부터 모든 값을 활성 시트로 가져옵니다.
  • Excel 추가 기능은 Windows 및 Mac의 모든 Office 버전에서 사용할 수 있습니다
  • 전체 애드 인에는 35 줄의 코드 만 있습니다. 궁금한 점이 있으면 주석이 달린 소스 코드를 확인하십시오.
  • 사용 된 CSV 목록 구분 기호 (쉼표 또는 세미콜론)는 로컬 Excel 설정에서 가져옵니다.
  • 인코딩이 UTF-8로 설정되었습니다

설치

  1. 추가 기능을 다운로드하여 추가 기능 폴더에 저장하십시오.%appdata%\Microsoft\AddIns
  2. 열기 Excel 및 추가 기능을 활성화 : File tab → Options → Add-Ins → Go To선택ImportCSV.xla
  3. VBA 매크로 활성화 : File tab → Options → Trust Center → Trust Center Settings → Macro Settings → Enable all macros
  4. Excel을 다시 시작하십시오.

추가 기능이라는 새로운 메뉴 표시 줄 항목이 표시되며이 버튼을 사용하여 번거롭지 않은 가져 오기 대화 상자를 거치지 않고 CSV 파일을 빠르게 열 수 있습니다.

여기에 이미지 설명을 입력하십시오


Windows 탐색기에서 직접 CSV를 여는 PowerShell 스크립트

PowerShell 스크립트를 사용하여 CSV 파일을 열고 자동으로 Excel로 전달할 수 있습니다. 이 스크립트는 Excel의 텍스트 가져 오기 방법을 자동으로 사용하여 항상 값을 텍스트로 처리하고 보너스로 UTF-8 인코딩을 처리합니다.

  1. 새 텍스트 파일을 만들고 아래 스크립트를 붙여 넣습니다. 주석이 달린 버전은 여기 에서 찾을 수 있습니다
$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. 같은 곳에 저장하십시오 C:\my\folder\myScript.ps1. (확장 참고 .ps1)
    • WinR» shell:sendto» 를 통해 sendto 폴더를여십시오Enter
  2. 마우스 오른쪽 버튼으로 클릭»새로 만들기»바로 가기를 통해 새 바로 가기를 생성 한 후이 줄을 붙여 넣습니다. 스크립트를 넣은 경로를 자신 만의 경로로 변경하는 것을 잊지 마십시오. 바로 가기 이름을 지정하십시오 (예 : Excel).

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

이제 여러 개의 CSV를 선택하고 다음을 통해 Excel에서 열 수 있습니다. Right-click » SendTo » Excel


1
추가 기능은 Office 2003 및 2013에서 테스트되었습니다
nixda

최고의 "최상의 방법"은 일회성 가져 오기에 정확히 필요한 것입니다. VBA를 망칠 필요가 없으며 날짜 / 숫자로 사용되는 열을 제어 할 수 있습니다 (나머지는 텍스트로 사용). CSV를 두 번 클릭 할 때 Excel 이이 가져 오기 마법사를 열도록 제안하고 싶습니다.
ADTC

@Vadzim 안녕하세요, 죽은 링크를 수정하려는 귀하의 노력에 감사드립니다. 실제로 ge.tt는 지난 몇 달 동안 문제를 일으켰습니다. 그러나 나는 모든 문제를 해결했으며 이전의 원래 링크는 다시 작동해야한다고 생각합니다. ge.tt에서 다운로드하기 전에 Chrome에서 경고하는 이유를 모르겠습니다. 그러나 다른 모든 브라우저는 정상적으로 작동하며 멀웨어가 아님을 보증 할 수 있습니다.
nixda

@nixda, 링크를 되살려 주셔서 감사합니다
Vadzim

@nixda ge.tt에 대한 링크가 다시 끊어졌습니다. 대부분은 소유자 가 TOS를 위반 했기 때문에 사용할 수 없다고 말합니다 . 그러나 OpenCSV.exe에 대한 파일 은 "이 파일 은 서비스 약관을 위반하여 더 이상 사용할 수 없습니다 "라고 말합니다 . ImportMyCSV Excel 함수의 작성자입니까? (소스 코드는 여전히 pastebin에서 사용할 수 있습니다) 이것은 훌륭한 도구입니다. 직장에서 사용하고 다른 사람들에게 추천했습니다. 그러나 저자의 적절한 신용을 얻기 위해 코드의 기원에 관심이 있습니다.
GlennFromIowa

5

.xlsx를 먼저 연 다음 데이터 연결을 만들고 .csv를 가져 와서 시도 할 수 있습니다. "쉼표"로 구분 한 다음 모든 열을 "일반"이 아닌 텍스트로 처리하는 옵션을 선택하십시오.

편집 : 아, 나는 질문을 완전히 읽지 못했습니다. 가져 오기 마법사에서 텍스트로 가져올 첫 번째 열 머리글을 선택하고 마지막 열 머리글로 스크롤 한 다음 머리글을 Shift + 클릭하십시오. 그런 다음 "텍스트"방사형 옵션을 선택하십시오.


2
예, 파일 확장자가 ".csv"가 아닌 한 잘 작동합니다. +1
Jean-François Corbett

4

다음을 수행하면 Wetmelon의 제안이 작동합니다 (.CSV에서도 가능).

  1. 빈 통합 문서 또는 워크 시트로 Excel 열기
  2. 클릭하여 데이터> 텍스트에서 [외부 데이터 가져 오기]
  3. Wetmelon이 설명하는대로 "텍스트 가져 오기 마법사"를 사용하십시오 (쉼표로 구분, 첫 번째 열을 선택하고 SHIFT + CLICK, 마지막 열을 선택하고 모든 것을 텍스트로 설정).

더 많은 단계라는 것을 알고 있지만 적어도 확장명을 변경하지 않고도 CSV를 이런 식으로 열 수 있습니다.


2

조심해!

수동 방법 사용시 "Excel → 데이터 → 외부 데이터 가져 오기 → 모든 열을 선택하고 텍스트 선택"......

이렇게하면 열이 "첫 번째 행에 데이터가있는"텍스트 (일반적으로 헤더 행)로만 설정됩니다. 이 마법사는 데이터가 아래에 있지만 첫 번째 행에는없는 열을 오른쪽으로 더 멀리 표시하지 않습니다. 예를 들면 다음과 같습니다.

Row1Col1, Row1Col2, Row1Col3

Row2Col1, Row2Col2, Row2Col3, Row2Col4

가져 오기 마법사에 Col 4가 표시되지 않으므로 가져 오기 전에 일반에서 텍스트 형식으로 변경할 수있는 옵션이 없습니다 !!!!


1
시간의 99.9999 % 이후로 사람들이 가져 오기 마법사에서 아래로 스크롤하지 않고 모든 열을 잡기가 어렵습니다. 그러나 기술적으로 가져 오기 마법사를 사용하는 동안 아래로 스크롤하여 첫 번째 행에 데이터가없는 추가 열을 잡을 수 있습니다.
GlennFromIowa

1

Jean-François Corbett가 위에 게시 한 코드를 대체하는 절차는 다음과 같습니다.

이 절차는 CSV 형식의 모든 열을 텍스트 형식으로 Excel로 가져옵니다.

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

새로운 답변을 추가하는 대신 수퍼 유저에 오신 것을 환영합니다. Corbett의 답변을 편집하고 개선해야합니다. 아직 평판이 충분하지 않다는 것을 알고 있지만 변경 내용을 주석으로 연결하여 읽을 수 있습니다.
Vlastimil Ovčáčík

0

항상 동일한 데이터 (일정한 레코드 형식, 레이아웃 등)를 가져 오는 경우 가져 오기 사양을 사용하여 Access 매크로를 작성한 다음 데이터를 Excel로 다시 덤프 할 수 있습니다. 이럴 수도 있습니다. 내가 한 다른 방법은 VBA를 사용하여 한 번에 한 레코드 씩 워크 시트로 데이터를 읽고 읽는대로 구문 분석하는 것입니다. 내가 아는 한 Excel에서 가져 오는 동안 기본 형식을 설정하는 방법은 없으며 다음 파일 형식에 문제가 생길 수 있습니다.


1
여기에 문제가 있습니다-가져올 때 쉼표 사이에있는 텍스트 문자열을 열에 넣는 것을 제외하고는 구문 분석을 시도하지 않습니다. 특정 방식으로 형식을 지정 해야하는 경우 날짜 문자열 날짜 등의 날짜 지정 등을 수행 할 수 있지만 처음에는 데이터를 그대로두면됩니다. 왜 그렇게 어려워?
William Gunn

0

요청으로 내 의견을 답변으로 제출하십시오 (약간의 정보가 추가됨).

Hey Scripting Guy는 유용한 정보를 얻을 수있는 Excel로 CSV 가져 오기 에 대한 블로그 기사 를 작성했습니다. Powershell 내부의 데이터 객체를 사용하면 원하는 작업을 수행 할 수 있습니다.

이 기사에서는 특히 숫자 형식을 남길 수있는 셀로 데이터를 가져 오는 것에 대해 언급하지만 데이터를 원시 텍스트로 셀에 강제로 입력하도록 Excel ComObject 속성 및 메서드 중 일부를 사용하여 수행 할 수 있습니다 가져 오기 전후에 텍스트로 셀 서식 지정).


0

알 수없는 이유로 모든 열에 대한 형식을 명시 적으로 제공하더라도 파일 확장자가 CSV 인 경우 Excel에서이를 무시합니다.

일부 옵션 :

  • Wetmelon이 제안한 대로 데이터를 가져 오는 쿼리를 작성하십시오 .
    단점 : 64 비트 시스템에서 CSV 데이터베이스 드라이버가 누락되었을 수 있습니다.

  • Jean의 코드를 사용 하되 파일을 임시 폴더에 복사하고 사본의 확장자를 변경하십시오.
    단점 : 원본 파일에 대한 링크가 없습니다 (저장하면 사본을 덮어 씁니다). 나중에 사본을 수동으로 삭제해야합니다. 여전히 원본 CSV 위에 다른 이름으로 저장을 수동으로 수행 할 수 있습니다.

  • 메모장에서 CSV를 열고 Ctrl+A, Ctrl+C, 엑셀, 다음 데이터에 붙여 넣기 - 텍스트 나누기, 그것은 당신이 한 번에 텍스트로 모든 열을 설정할 수 있습니다 일반적인 마법사입니다. Excel에서 소중한 확장명을 숨기므로 이전 옵션의 다른 맛입니다.
    단점 : 수동.

  • 전체 파일을 메모리로 읽고 셀 단위로 시트에 넣는 매우 간단한 VBA 루프가 있습니다.
    단점 : 느리고 추한.


"원본 [CSV] 파일에 대한 링크가 없습니다"가 이러한 모든 방법의 단점이 아닙니까? 임시 폴더로 복사하고 확장명을 변경하는 아이디어가 마음에 듭니다 ... 사본이 열리 자마자 원본 (CSV)을 덮어 쓸 수도 있습니다.
장 프랑수아 Corbett

@ Jean-FrançoisCorbett, 가져 오기 마법사를 사용하여 csv 확장명을 가진 .csv 파일 을 Excel 2010 으로 가져옵니다 . 열 형식을 텍스트로 명시 적으로 지정하고 셀 형식을 텍스트로 유지합니다. 아마도 이것은 이전 버전의 Excel에서 문제가 되었습니까?
GlennFromIowa

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.