2016-08-24 5 views
0

CSV 파일을 읽고 하나의 필드 만있는 CSV 파일을 출력하고 싶습니다. 나는 간결한 예를 만들려고 노력했다.Export-Csv가 길이가 아닌 값을 내 보냅니다.

PS C:\src\powershell> Get-Content .\t.csv 
field1,field2,field3 
1,2,3 
4,55,6 
7,888,9 

PS C:\src\powershell> Import-Csv -Path .\t.csv | ` 
>>  ForEach-Object { 
>> $_.field2 ` 
>>  } | ` 
>>  Export-Csv -Path .\x.csv -NoTypeInformation 
>> 

문제는 길이가 field2가 내 보낸 CSV 파일에 기록된다는 것입니다. 필자는 필드 머리글을 "field2"로하고 값을 원래 CSV 파일에서 가져 오려고합니다. 또한, 나는 그들이 필요할 때만 따옴표를 원한다. 어디서나.

나는 Export-CSV exports length but not nameExport to CSV only returning string length을 읽었습니다. 그러나 이것들은 헤더와 하나의 필드 값을 가진 실제 CSV 파일을 생성하는 것으로는 보이지 않습니다.

PS C:\src\powershell> get-content .\x.csv 
"Length" 
"1" 
"2" 
"3" 

답변

2

CSV 객체는 우리가 각 행 개체를 필터링하고 바로 필드 (들)을두고해야합니다, 그래서 우리가 Select-Object cmdlet을 사용하여 원하는 해당 필드를 저장하기 위해 각 행에 참고 속성을 사용 (별칭 : select), 한 번에 전체 CSV 개체를 처리하는 :

Import-Csv 1.csv | select field2 | Export-Csv 2.csv -NoTypeInformation 

참고, 거기는 |로 끝나는 경우 행의 끝을 탈출 할 필요가 (, {, 없다, 또는을.
여러 필드를 지정할 수 있습니다 : select field2, field3.


불필요한 쌍 따옴표 일반적인 다중 필드 케이스 스트립 :

Import-Csv 1.csv | 
    select field2 | 
    %{ 
     $_.PSObject.Properties | %{ $_.value = $_.value -replace '"', [char]1 } 
     $_ 
    } | 
    ConvertTo-Csv -NoTypeInformation | 
    %{ $_ -replace '"(\S*?)"', '$1' -replace '\x01', '""' } | 
    Out-File 2.csv -Encoding ascii 

단순화 1 필드의 경우 :

필드 안에 포함 된 인용 까다로운 경우를 해결 하였다
Import-Csv 1.csv | 
    select field2 | 
    %{ 
     $_.field2 = $_.field2 -replace '"', [char]1 
     $_ 
    } | 
    ConvertTo-Csv -NoTypeInformation | 
    %{ $_ -replace '"(\S*?)"', '$1' -replace '\x01', '""' } | 
    Out-File 2.csv -Encoding ascii 

일시적으로 제어. 자 코드 01로 대체합니다 (09/탭, 0A/행 넘김, 0D/캐리지 리턴).

+0

나는 (1) 필드를 가지고 있다고 생각합니다. 일반 CSV 사용을 위해이를 전체 솔루션으로 변환하려면 약간의주기가 필요합니다. Powershell이 ​​견적을 제어하는 ​​스위치를 제공해야합니다. 일부는 인용 된 모든 분야를 원하거나 필요로 할 수도 있습니다. 필드에 따옴표 문자 나 구분 기호가 포함되어 있지 않으면 따옴표를 생략하고 싶습니다. – lit

1

WOxxOm의 응답에 따르면 Select-Object은 입력과 파이프에서 필드를 선택하여 출력하는 가장 좋은 방법입니다.

인용 부호와 관련하여 이는 PowerShell의 알려진 (실망스러운) 문제입니다. 구분 문자로 ,을 지정하는 것은 도움이되지 않았습니다. ConvertTo-CsvForeach-Object 대체품을 사용하여 반올림했습니다. 데이터에 따옴표가 포함되어 있으면 교체해야합니다.

Import-Csv .\1.csv | 
Select-Object field2 | 
ConvertTo-Csv -NoTypeInformation | 
ForEach-Object {$_ -replace '"',''} | 
Out-File .\2.csv 
+0

감사합니다. @ gms0ulman. 이것은 효과가 있지만 언급 한 바와 같이 따옴표 삭제는 여러 상황에서 작동하지 않습니다. – lit

관련 문제