2017-04-06 1 views
-1

내가해야 할 일은 전체 텍스트 파일 (CSV, 한 디렉토리에 있음)을 가져 와서 전체 출력을 한 줄씩 바꿔 파일을 만듭니다. 하단에서 끝나는 대신 상단.ForEach 루프를 사용하여 CSV 파일을 뒤집기

하나의 파일 (이름)을 가져 와서 첫 번째 줄을 복사하고 그 줄만있는 새 파일을 만들 수 있습니다. 그런 다음 원본 파일에서 첫 번째 줄을 빼고 배열로 읽어 들여이를 역순으로 사용합니다. 그런 다음 헤더가있는 파일에만 추가합니다. 그것은 출력 이름을 제외하고는 괜찮습니다. [file-REV.csv]하지만 지금까지는 단지 [file.csv-REV]에 도달했습니다 ...

일단 작업이 완료되면, 시간이 있다고 생각했습니다. 프로그램은 디렉토리에있는 csv을 모두 찾은 다음 루프를 반복하여 각각에 대해 역 파일을 만듭니다. 여기

cd c:\users\$([Environment]::UserName)\working 

$Path = "c:\users\$([Environment]::UserName)\working\" 

ForEach ($file in Get-ChildItem -Filter *.csv) { 
    Get-Content $file -totalcount 1 | Set-Content .\$file-REV.csv 
    $flip = (get-content | select -Skip 1) 
    [array]::Reverse($flip) 
    $flip | add-content "$file-REV.csv" 
} 

스크립트 실행했을 때받은 메시지입니다 :

내가 지금까지 무엇을 가지고

cmdlet Get-Content at command pipeline position 1

Supply values for the following parameters:

Path[0]:

내가 전체 경로에 넣어 시도한를 Get-Content -Path c:\users\jmurphy\working\ 다음 그것은 전체 경로를 찾을 수 없다는 불평을합니다.

+2

내가 추천 제일 먼저의 출력을 살펴 보는 것입니다 ['은 Get-도와 줘요-ChildItem을 -Detailed'] (https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft. powershell.management/get-childitem)와 ['받기 - 도와 줘요-내용 -Detailed'] (https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.management/get- 함유량). Get-Help cmdlet은 PowerShell을 사용하는 방법을 배울 때 가장 유용합니다. –

+1

무시 잠재적 인 다른 문제'은 Get-content' 블록은 루프에서 파일 이름이 만들어주는'$ 플립 = (GET-콘텐츠 $ 파일 | 선택 - 스킵 1)'. _c : \ users \ jmurphy \ working_은 파일이 아닌 폴더입니다. – Matt

+0

감사합니다. 나는 너의 제안으로 시작할 것이다. 나는 Get-Help에 대해서도 몰랐다. (MS-man은 그 소리처럼 들린다.) 감사! –

답변

1

몇 가지. 먼저 변수에서 작업 할 폴더를 정의하므로 Get-ChildItem에서 해당 폴더를 사용하십시오. ($Path이 환경 범위에서 이미 변수로 사용 되었기 때문에 이름을 $Folder으로 바꿉니다. 또한 $env:은 환경 범위 밖으로 변수를 읽는 더 빠른 방법입니다.).

$Folder = "C:\Users\$env:UserName\working\" 
$Files = Get-ChildItem $Folder -Filter *.csv 

둘째, 당신은 단지 각 파일의 전체 경로이기 때문에 Get-ChildItem에서 반환 무엇에서 Fullname 속성을 사용하는 것이 좋습니다.

ForEach ($File in $Files) { 

그래서 당신은 당신의 Get-Content

Get-Content $File.Fullname -totalcount 1 | Set-Content .\$($file.Basename)-REV.csv 

에서 파일에 그 전체 경로를 사용하는 것이 좋습니다 당신은 당신이 다시 Get-Content를 호출 할 때 파일의 경로로 다시 $File를 사용하는 것이 좋습니다 :

$Flip = (Get-Content $File.Fullname | Select -Skip 1) 

Basename 확장자없이 바로 파일 이름 Get-Childitem의 속성입니다. $()에 묶음으로써 큰 ​​따옴표 안에있는 변수의 속성을 강제로 평가할 수 있습니다.

$Flip | Add-Content "$($file.Basename)-REV.csv" 

모두 함께 스크립트는 다음과 같아야합니다

$Folder = "C:\Users\$env:UserName\working\" 
$Files = Get-ChildItem $Folder -Filter *.csv 
ForEach ($File in $Files) { 
    Get-Content $File.Fullname -totalcount 1 | Set-Content .\$($file.Basename)-REV.csv 
    $Flip = (Get-Content $File.Fullname | select -Skip 1) 
    [array]::Reverse($Flip) 
    $Flip | Add-Content "$($file.basename)-REV.csv" 
} 
+0

헤이 벤, 탁월한 답변! 전체 코드 블록을 문자열로 해석하는 대신 StackOverflow 구문 강조 표시가 올바르게 작동하도록 경로에서 후행 슬래시를 제거해야합니다. (백 슬래시 문자는 C#과 같은 다른 언어의 이스케이프 문자입니다.) – Bluecakes

+0

@ 블루 케이크 정말 필요 없습니다. 편집을보세요. 이 때 나는 소스를 너무 많이 변경하지 않기 위해' '를 사용한다. 그것은 완벽하지는 않지만 조금 나아졌습니다. – Matt

+0

그 값 비싼 대가를 치르지 않고도 한 번에 파일을 읽고 그에 따라 분할하지 않는 것이 어떻겠습니까? 또한 나는 당신이 fullname 속성을 독점적으로 사용해야한다고 생각하지 않는다.'$ file'만이 작동 할 것이다. – Matt

0

조, 당신은 PowerShell을 학습에 큰하고 있습니다. 객체 지향의 힘을 조금 더 활용하면됩니다.

Get-ChildItem이 파일에 대한 개체를 반환한다는 것을 이미 알고 있습니다. 당신이 알아야 할 것은 그 객체에 포함 된 멤버들입니다. Get-Member를 사용하여 알아보십시오.

$file = Get-ChildItem .\t.csv 
$file | Get-Member 

재미있는 회원을 찾으면 그 가치가 무엇인지 확인하십시오.

$file.Name 
$file.Extension 
$file.BaseName 

이렇게하면 새 파일 이름을 구성 할 수 있습니다.

$newFilename = $file.Basename + '-REV' + $file.Extension 

Get-Content 행 앞에 입력하십시오. 그런 다음 Add-Content에 $ newFilename을 사용하십시오.

관련 문제