엑셀 CSV 파일 배열로 변환 :: CsvToArray 명령문

CSV 파일 또는 문자열을 엑셀 파일의 배열로 변환하는 CsvToArray 명령문의 사용법 및 동작원리를 알아봅니다.

작성자 :
오빠두엑셀
최종 수정일 : 2021. 05. 10. 01:06
URL 복사
메모 남기기 : (4)

엑셀 CSV 파일 배열로 변환 :: CsvToArray 명령문 사용법 총정리

엑셀 CsvToArray 명령문 목차 바로가기
요약

엑셀 CsvToArray 명령문은 CSV 파일 또는 CSV 문자열을 엑셀 파일의 배열로 변환합니다.

명령문 구문
CsvToArray 파일경로, [파일여부], [열강제맞춤]
사용된 인수 및 변수 알아보기
인수 설명
파일경로(또는 문자열)
[String]
CSV 파일 경로 또는 CSV 문자열을 입력합니다.
파일여부
[Boolean, 선택인수]
만약 첫번째 인수로 CSV 문자열을 입력했을 경우 FALSE를 입력합니다. 기본값은 TRUE 입니다.
열강제맞춤
[Boolean, 선택인수]
TRUE 일 경우 CSV 파일 내부 오류로 인해 각 행의 열 개수가 다를 경우, 모든 열의 개수를 최대 열 개수로 강제맞춤 합니다. 기본값은 FALSE 입니다.

예제파일 다운로드

오빠두엑셀의 강의 예제파일은 여러분을 위해 자유롭게 제공하고 있습니다.


상세 설명

엑셀 CsvToArray 함수는 CSV 파일 또는 CSV 문자열을 엑셀 파일의 배열로 변환하는 사용자 지정 함수입니다. CSV 파일을 엑셀파일로 빠르게 불러오거나 외부 API를 통해 받아온 CSV 데이터를 빠르게 엑셀로 불러올 수 있습니다.

엑셀 CSV 파일 변환 예제
CsvToArray 명령문 실전 사용 예제 (CSV 파일 엑셀 불러오기)

간혹 일부 API의 결과가 잘못 반환되거나 CSV 파일에 오류가 있어 일부 행에서 열의 개수가 달라 배열로 반환할 때 오류가 발생할 수 있습니다. 그럴 경우, 열강제맞춤 여부를 TRUE로 입력하면 정확한 배열을 반환할 수 있습니다.

실전 사용 예제
  1. 실행중인 통합문서와 동일한 경로에 있는 CSV 파일을 엑셀로 불러오기
    Sub Test1()
     
    'ArrayToRng 명령문은 아래 링크에서 복사 후 모듈에 추가합니다.
    'www.oppadu.com/vba-arraytorng-함수/
    Dim vArr As Variant
    vArr = CsvToArray(ThisWorkbook.Path & "\" & "테스트.csv", True)
    ArrayToRng Range("A1"), vArr
     
    End Sub
  2. API에서 받아온 CSV 문자열을 엑셀로 출력하기
    Sub Test2()
     
    'ArrayToRng 명령문은 아래 링크에서 복사 후 모듈에 추가합니다. 
    'www.oppadu.com/vba-arraytorng-함수/
    Dim vArr As Variant
    vArr = CsvToArray("a,b,c,d,e" & Chr(10) & "f,g,h,i,j", False)
    ArrayToRng Sheet1.Range("A1"), vArr
     
    End Sub

엑셀 CSV 파일 배열로 변환, CsvToArray 명령문 동작원리

CsvToArray 명령문 전체 코드
Function CsvToArray(strCSV As String, Optional isFile As Boolean = True, Optional isDiffCols As Boolean = False) As Variant
 
'###############################################################
'오빠두엑셀 VBA 사용자지정함수 (https://www.oppadu.com)
'■ CsvToArray 함수
'■ CSV파일(콤마로 분리된 문자열)을 배열로 반환합니다.
'■ 인수 설명
'_____________strCSV          : CSV 문자열 또는 CSV 파일 경로입니다.
'_____________isFile          : 첫번째 인수가 파일경로일 경우 TRUE를 입력합니다. 기본값은 FALSE 입니다.
'_____________isDiffCols      : 파싱 오류로 인해 각 행의 열 개수가 다를 경우 TRUE로 입력하면 열의 최대개수를 강제로 조절합니다.
'■ 사용 예제
'Array = CsvToArray("a,b,c,d,e")
'■ 사용된 보조 함수
'Read_TextFile 함수
'##############################################################
 
Dim i As Long: Dim j As Long: Dim X As Long
Dim Rows As Long: Dim Cols As Long: Dim tempCols As Long
Dim strRow As String
Dim vRows As Variant
Dim vRow As Variant
Dim vResult As Variant
 
Const q = """"
Const qq = q & q
 
If isFile = True Then strCSV = Read_TextFile(strCSV)
 
If Len(strCSV) Then
 
    For i = 1 To Len(strCSV)
        Select Case Mid(strCSV, i, 1)
            Case q:   X = X + 1
            Case Chr(10): If X Mod 2 Then Mid(strCSV, i, 1) = "|"
        End Select
    Next
 
    vRows = Split(Trim(strCSV), Chr(10))
    Rows = UBound(vRows) + 1
 
    If isDiffCols = False Then
        Cols = UBound(Split(vRows(0), ",")) + 1
    Else
        For i = 0 To Rows - 1
            tempCols = UBound(Split(vRows(i), ",")) + 1
            If tempCols > Cols Then Cols = tempCols
        Next
    End If
 
    ReDim vResult(1 To Rows, 1 To Cols)
 
    For i = 1 To Rows
        strRow = vRows(i - 1)
 
        If Len(strRow) Then
            If InStr(strRow, "|") Then strRow = Replace(strRow, "|", Chr(10))
            If InStr(strRow, qq) Then strRow = Replace(strRow, qq, "|")
 
            For j = 1 To Len(strRow)
                Select Case Mid(strRow, j, 1)
                    Case q:   X = X + 1
                    Case ",": If X Mod 2 Then Mid(strRow, j, 1) = "♩"
                End Select
            Next
 
            If InStr(strRow, q) Then strRow = Replace(strRow, q, "")
            vRow = Split(strRow, ",")
            If isDiffCols = True Then Cols = UBound(Split(strRow, ",")) + 1
 
            For j = 1 To Cols
                strRow = vRow(j - 1)
                If InStr(strRow, "♩") Then strRow = Replace(strRow, "♩", ",")
                If InStr(strRow, "|") Then strRow = Replace(strRow, "|", q)
                vResult(i, j) = strRow
            Next
 
        End If
    Next
 
    CsvToArray = vResult
 
End If
 
End Function
 
Function Read_TextFile(sPath As String, Optional Charset As String = "UTF-8") As String
 
'###############################################################
'오빠두엑셀 VBA 사용자지정함수 (https://www.oppadu.com)
'■ Read_TextFile 함수
'■ 텍스트 또는 CSV 파일을 읽어옵니다.
'■ 인수 설명
'_____________sPath          : 텍스트 또는 CSV 파일의 파일경로입니다.
'_____________Charset        : [선택인수] 인코딩형식입니다. 기본값은 UTF-8 입니다. Unicode, ANSI 등으로 설정할 수 있습니다.
'■ 사용 예제
's = Read_TextFile("C:\Temp\Test.txt")
'##############################################################
 
On Error GoTo EH:
 
Dim objADO As Object
Set objADO = CreateObject("ADODB.Stream")
 
With objADO
    .Open
    .Charset = Charset
    .LoadFromFile sPath
    Read_TextFile = .ReadText
End With
 
Exit Function
 
EH:
Read_TextFile = ""
 
End Function
명령문 동작원리 단계별 알아보기
  1. 명령문에 사용할 변수를 선언하고 변수에 값을 입력합니다.
    Dim i As Long: Dim j As Long: Dim X As Long
    Dim Rows As Long: Dim Cols As Long: Dim tempCols As Long
    Dim strRow As String
    Dim vRows As Variant
    Dim vRow As Variant
    Dim vResult As Variant
     
    Const q = """"
    Const qq = q & q
  2. CSV 파일에서 읽어올 경우 Reat_TextFile 함수로 파일을 읽어옵니다.
    If isFile = True Then strCSV = Read_TextFile(strCSV)
  3. CSV 문자열 중 큰따옴표(") 에 포함된 줄바꿈을 세로바로 변경합니다. 이후 CSV 줄바꿈 기준으로 배열을 생성합니다.
    If Len(strCSV) Then
     
        For i = 1 To Len(strCSV)
            Select Case Mid(strCSV, i, 1)
                Case q:   X = X + 1
                Case Chr(10): If X Mod 2 Then Mid(strCSV, i, 1) = "|"
            End Select
        Next
     
        vRows = Split(Trim(strCSV), Chr(10))
        Rows = UBound(vRows) + 1
  4. 열강제맞춤 여부가 TRUE일 경우 최대 열 개수를 확인하여 출력할 배열을 생성합니다.
        If isDiffCols = False Then
            Cols = UBound(Split(vRows(0), ",")) + 1
        Else
            For i = 0 To Rows - 1
                tempCols = UBound(Split(vRows(i), ",")) + 1
                If tempCols > Cols Then Cols = tempCols
            Next
        End If
     
        ReDim vResult(1 To Rows, 1 To Cols)
  5. 줄바꿈 기준으로 생성된 배열을 하나씩 돌아가며 쉼표(,) 기준으로 나눈 뒤 출력 배열 안에 값을 하나씩 입력합니다.
        For i = 1 To Rows
            strRow = vRows(i - 1)
     
            If Len(strRow) Then
                If InStr(strRow, "|") Then strRow = Replace(strRow, "|", Chr(10))
                If InStr(strRow, qq) Then strRow = Replace(strRow, qq, "|")
     
                For j = 1 To Len(strRow)
                    Select Case Mid(strRow, j, 1)
                        Case q:   X = X + 1
                        Case ",": If X Mod 2 Then Mid(strRow, j, 1) = "♩"
                    End Select
                Next
     
                If InStr(strRow, q) Then strRow = Replace(strRow, q, "")
                vRow = Split(strRow, ",")
                If isDiffCols = True Then Cols = UBound(Split(strRow, ",")) + 1
     
                For j = 1 To Cols
                    strRow = vRow(j - 1)
                    If InStr(strRow, "♩") Then strRow = Replace(strRow, "♩", ",")
                    If InStr(strRow, "|") Then strRow = Replace(strRow, "|", q)
                    vResult(i, j) = strRow
                Next
     
            End If
        Next
  6. CsvToArray 명령문으로 출력배열을 반환 후 명령문을 종료합니다.
        CsvToArray = vResult
     
    End If
5 3 투표
게시글평점
4 댓글
Inline Feedbacks
모든 댓글 보기
4
0
여러분의 생각을 댓글로 남겨주세요.x