PowerShell의 Export-Csv
cmdlet과 Import-Csv
cmdlet은 관리자가 foreach 루프를 통해 CSV를 가져올 수 있도록 하며, Export-Csv
를 사용하여 CSV에 추가하고 배열을 CSV 파일로 내보내는 등 다양한 작업을 가능하게 합니다.
이 문서에서는 PowerShell을 사용하여 CSV를 관리할 수 있는 여러 일반적인 시나리오에 대해 알아볼 것입니다. 예를 들어:
- PowerShell을 사용하여 CSV 파일 읽기
- PowerShell을 사용하여 CSV 파일 저장
Export-CSV
실행 전 출력 형식 지정- CSV에 추가하기
- 기존 파일에 차이 추가하기
Export-CSV
와#TYPE
문자열
CSV 파일의 내부 동작에 익숙하지 않은 경우, CSV 파일은 테이블에서 값들을 쉼표로 구분하는 표준 형식을 따르는 텍스트 파일입니다. Export-Csv
cmdlet을 사용하여 하나 이상의 개체를 생성하고 이를 파이프하여 CSV 파일을 만들 수 있습니다.
아래의 명령은 첫 번째로 실행 중인 두 개의 프로세스를 찾고, 생성된 개체를 Export-Csv
cmdlet에 전달합니다. 그런 다음 Export-Csv
cmdlet은 시스템 드라이브의 루트(아마도 C:\)에 processes.csv라는 이름의 CSV 파일을 생성합니다.
이제 메모장으로 processes.csv 파일을 엽니다. 맨 위에 "Name","SI","Handles","VM"
이라는 헤더가 보일 것입니다. 또한 #TYPE System.Diagnostics.Process
도 보일 것입니다. 이해하기 어려울 수 있지만, 이 글에서는 해당 문자열에 대해 설명하겠습니다.
Import-Csv를 사용하여 CSV 파일 읽기
이와 같은 팁을 더 알고 싶다면, 제 개인적인 PowerShell 블로그를 확인해보세요.
PowerShell에는 텍스트 파일을 읽을 수 있는 몇 가지 명령이 있습니다. 이 명령어는 Get-Content
와 Import-Csv
입니다. 이 두 개의 cmdlet은 기술적으로 파일을 동일한 방식으로 읽습니다. 그러나 Import-Csv
는 한 단계 더 나아갑니다. Import-Csv
는 텍스트 파일 뿐만 아니라 CSV 파일의 내부 구조도 이해합니다.
CSV 파일은 특정 스키마를 따르기 때문에, Import-Csv
는 CSV 스키마를 이해합니다. 이 cmdlet은 디스크에서 텍스트 파일을 읽을 뿐만 아니라 CSV 파일의 행을 PowerShell 개체로 변환합니다.
CSV가 아닌 파일
일반적으로 CSV 파일은 쉼표로 구분되지만, 때로는 (기술적으로는 CSV가 아니지만) 다른 구분 기호로 데이터가 구분된 CSV가 있을 수 있습니다. 이러한 구분 기호는 때로는 탭 또는 세미콜론일 수 있습니다.
CSV 파일의 다른 구분 기호가있는 경우 Delimiter
매개 변수를 사용할 수 있습니다. 이 매개 변수는 Import-Csv
에게 기본적으로 쉼표가 아닌 다른 값을 찾도록 지시합니다.
예를 들어, 탭으로 구분된 파일이 있는 경우 다음과 같이 파일을 읽을 수 있습니다:
헤더 추가
A common Import-Csv
parameter is Header
. This parameter lets you specify the property names of the objects created by this cmdlet.
Import-Csv
cmdlet은 기본적으로 CSV 파일의 맨 위 행을 헤더로 처리합니다. 그런 다음 이러한 값들을 각 행 (객체)의 속성으로 변환합니다. 그러나 헤더 행이없는 CSV 파일이있는 경우 Header
매개 변수를 사용하여 직접 정의 할 수 있습니다.
Header
매개 변수는 Import-CSV
가 첫 번째 행을 헤더로 사용하지 않도록하며 헤더를 수동으로 열어서 헤더를 추가해야하는 불편함을 피 할 수 있습니다.
이 동작을 설명하기 위해 메모장을 열고 아래 텍스트를 복사하여 붙여 넣습니다. 이 텍스트는 세 개의 행과 두 개의 열이있는 데이터 세트를 나타냅니다.
텍스트 파일을 test.csv로 저장합니다. 파일 유형 확장명을 사용하도록하거나 파일을 작은 따옴표로 감싸서 .csv.txt로 끝나는 파일로 실수로 저장하지 않도록합니다!
이제 Header
매개 변수없이 최근에 생성 된 CSV 파일을 읽기 위해 Import-CSV
를 사용하고 출력을 검사하세요.
첫 번째 행을 객체 속성으로 사용한다는 것을 알아두세요. A
와 1
은 객체 속성으로 사용하려는 “레이블”이 아닙니다. A
, b
및 c
는 문자이고, 1
, 2
및 3
은 숫자입니다. 아래와 같이 Header
매개변수를 사용하여 이를 정의해야 합니다:
PowerShell로 CSV 파일 저장하기
PowerShell 객체에서 CSV 파일을 생성하거나 저장해야 하는 경우 다른 방법으로 진행할 수도 있습니다. Import-Csv
cmdlet은 CSV 파일을 PowerShell 객체로 “변환”하는 반면, Export-Csv
는 그 반대로 PowerShell 객체를 CSV 파일로 “변환”합니다.
Export-Csv
를 사용하여 CSV 파일을 저장하면 나중에 데이터를 다른 시스템에서 볼 수 있거나 사용할 수 있습니다.
예를 들어, Get-Process
를 Export-Csv
cmdlet에 파이핑하여 컴퓨터에서 실행 중인 모든 프로세스를 저장할 수 있습니다.
Export-Csv
cmdlet은 원래 간단한 기능을 가지고 있지만 몇 가지 유의할 점이 있습니다.
Export-CSV 실행 전에 출력 형식 지정
위에서 보았듯이 Export-Csv
는 “원시” 변환이 수행됩니다. 특별한 리치 텍스트 형식 지정이나 색상 추가 등은 수행하지 않습니다.
가장 흔한 실수 중 하나는 CSV로 내보내기 전에 출력을 예쁘게 만들려는 시도입니다. 많은 사용자가 CSV로 내보내기 전에 출력을 개선하려고 할 것입니다. 하지만 이제 보여줄 것은 상황을 더 악화시킬 것입니다.
마이크로소프트 엑셀에서는 CSV 파일을 열고 이탤릭체, 볼드체, 색상 등을 추가할 수 있지만, 파일을 CSV 형식으로 저장하면 모든 서식이 삭제됩니다. CSV 파일은 그저 쉼표(또는 때로는 탭)로 구분된 값이 포함된 일반 텍스트 파일일 뿐입니다.
CSV 파일은 단순히 “스마트”하지 않습니다.Import-Csv
를 Format-*
PowerShell cmdlet에 파이핑하는 것은 예상대로 작동하지 않습니다.
마이크로소프트 Export-Csv 문서에 따르면: “객체를 Export-CSV
cmdlet에 보내기 전에 형식을 지정하지 마십시오. Export-CSV
가 형식이 지정된 객체를 받으면 CSV 파일에는 객체 속성이 아닌 형식 속성이 포함됩니다.”
이유는 무엇일까요?
PowerShell 창을 열고 가짜 데이터를 만들어 보십시오. 이 문서의 첫 번째 섹션에서 다룬 Get-Process
예제를 사용하겠습니다. 그러나 이번에는 출력을 변수에 할당하십시오. 그런 다음, 이러한 프로세스 객체를 Format-Table
cmdlet에 파이핑하십시오.

Format-Table
Format-Table
을 사용하면 깔끔하고 표 형식의 출력이 생성됩니다.
이제 이 출력을 다른 변수에 저장해 보십시오.
$a
와 $b
변수 값의 속성을 Get-Member
로 확인해 보십시오. 이 cmdlet을 사용하면 이 두 개체가 왜 CSV 파일로 동일한 방식으로 내보내지 않는지 이해할 수 있습니다.


Format-Table
‘s many object typesGet-Process
에서 직접적으로 반환되는 출력은 다음과 같습니다. TypeName: System.Diagnostics.Process
반면에 Format-Table
의 출력은 완전히 다릅니다. 다양한 유형과 속성이 있는 여러 유형이 반환됩니다.
콘솔에서 $a
와 $b
를 보면 출력이 동일해 보입니다. 이 동작은 PowerShell의 형식 지정 시스템으로 인한 것입니다.
Export-Csv
의 출력에 어떤 영향을 미치나요?
Export-Csv
는 각 개체를 그대로 읽습니다. 출력을 Format-*
cmdlet로 파이핑하면 Export-CSV
가 수신하는 입력이 변경됩니다. 이로 인해 새로운 CSV 파일에 저장되는 출력이 영향을 받습니다.
Export-Csv
cmdlet에 출력을 파이핑할 경우, 어떤 Format-*
cmdlet에도 출력을 파이핑하지 마십시오.
CSV는 데이터에 중점을 둔 것임을 기억하십시오.
CSV 파일에 추가하기
가끔은 새로 만들지 않고 기존 파일에 추가하고 싶을 수도 있습니다. 기본적으로 Export-Csv
는 Path
매개변수로 지정된 파일을 덮어씁니다.
CSV에 데이터를 추가해야 하는 경우 Append
매개변수를 사용하십시오.
각 객체를 CSV에 저장하려는 루프가 있다고 가정해 봅시다. 각 반복에서는 CSV 파일에 저장하려는 다른 객체가 있습니다. Export-Csv
를 반복적으로 호출하면 Append
매개변수를 사용하지 않으면 해당 CSV 파일을 덮어쓸 것입니다. Append
매개변수를 사용하지 않으면 대부분의 경우 원하는 출력이 아닌 마지막 객체만 얻게 됩니다.
아래 예제는 처음 다섯 개의 실행 중인 프로세스를 찾습니다. 그런 다음 PowerShell Import-Csv
foreach 루프에 진입하여 Name
및 ProductVersion
속성을 한 번에 한 개씩 test.csv 파일에 기록합니다.
Append
매개변수를 사용하지 않으면 CSV 파일에는 다섯 번째 프로세스만 표시됩니다.
CSV 파일에 차이를 추가
Export-Csv
를 사용하여 기존 CSV 파일에 속성의 차이만 추가하는 것도 가능합니다. 즉, CSV 행의 열과 기록할 객체가 다른 경우에만 추가하도록 할 수 있습니다.
CSV 파일에 차이만 추가하려면 Append
및 Force
매개변수를 함께 사용해야 합니다. Microsoft 문서에 따르면 “Force 및 Append 매개변수를 결합하면 속성이 일치하지 않는 객체를 CSV 파일에 작성할 수 있습니다. 일치하는 속성만 파일에 기록됩니다. 속성이 일치하지 않으면 해당 속성은 폐기됩니다.”
데모를 위해 두 개의 속성 Name
과 Age
를 가진 하나의 객체를 생성합니다.
이제 다른 객체를 만들어 Name
과 Zip
속성을 가지게 합니다.
각 객체는 다른 속성을 가지고 있습니다.
그다음, 첫 번째 객체에서 CSV 파일을 생성한 다음, Force
매개 변수 없이 두 번째 객체를 CSV에 추가하려고 하면 오류가 발생합니다.

Export-Csv
without Force
하지만, Force
매개 변수를 사용하면 Export-Csv
가 잘 작동합니다.
하지만, CSV 파일에서 Zip
열이 사라진 것을 알 수 있습니다. Force
를 사용할 때 주의하십시오. 원하는 출력을 제공하지 않을 수도 있습니다.
Export-CSV
및 #TYPE
문자열
기본적으로 추가 매개 변수 없이 Export-CSV
를 사용하면 CSV 파일의 맨 위에 #TYPE
문자열이 포함됩니다. 그런 다음 이 문자열은 Export-Csv
가 받은 객체의 유형이 따라옵니다.
대부분의 경우, 이 문자열은 실제로 사용자에게 유용하지 않습니다. 이 문자열은 속성과 값이 어떤 객체에서 나왔는지 유지해야 할 경우에만 필요합니다.
이 문자열을 제거하려면 NoTypeInformation
매개 변수를 사용하십시오. 이 매개 변수는 이 문자열을 CSV에서 완전히 제거합니다.
PowerShell Core의 경우, 이는 더 이상 필요하지 않습니다.
요약
Import-CSV
및 Export-CSV
PowerShell cmdlet을 사용하면 CSV 파일을 쉽게 작업할 수 있습니다. 이 두 가지 유용한 cmdlet은 객체와 CSV 파일을 다룰 때 자주 사용해야 할 것입니다.
저는 여기에 설명과 예제를 표시하여 이러한 cmdlet을 활용할 수 있는 상황을 명확하게 이해하실 수 있기를 바랍니다.
이와 같은 팁을 더 원하시나요? 제 개인 PowerShell 블로그를 확인해보세요.