2014-10-16 3 views
0

하나의 CSV 파일에서 데이터를 가져오고 가져온 데이터로 계산을 한 다음 새 CSV 파일에 저장하려고합니다. 과거의 모든 날.특정 CSV 열에서 계산하여 새 파일로 출력

요약 :

나는 파이프 데이터 열이 CSV를 delimitated 한 :

COLA, COLB, COLC, 감기, 콜

콜라는 문자열 형식의 날짜 시간 "20/01/2011

COLC는

내가 처음 CSV를 읽을 필요가 다수에게 있습니다 14시 20분 0초 "(DD/MM은/년 HHMMSS), 다음 콜라의 값에서 두 개의 계산합니다 1 - 2000 년 1 월 1 일 이후의 일 수 및 2 자정부터의 분 수. data.csv에

예 DATA :

01/01/2011 14:20:00|10|6|10|192.168.11.7| 
01/01/2011 14:25:00|2|0|10|192.168.11.7| 
01/01/2011 14:30:00|4|8|10|192.168.11.7| 
01/01/2011 14:35:00|6|9|10|192.168.11.7| 

그때, 일부/열이 추가의 하드 코딩 된 값 (원시 DTA를 갖는 새로운 CSV 파일로 출력에는 헤더를 상기 계산 된 데이터를 필요로하지) :

은 는 는

은 (년 1 월 1 2000), (자정부터 분), 5 수, (COLC 값), 1, 텍스트, A, 이후 일 수는

0 괄호 안의 값이 계산됩니다 **/또는 원래 CSV에서 전달되었습니다. 다른 모든 값은 각 CSV 행에 하드 코딩됩니다. 예 DATA 위, 새로운 출력이 될 것이기

그래서 (내가 다시 포맷 목적을 위해 여분의 줄 바꿈에 넣어 한) :

4018,860,5,6,1,Text,A,0 
4018,865,5,0,1,Text,A,0 
4018,870,5,8,1,Text,A,0 
4018,875,5,9,1,Text,A,0 

내가 여기까지와 같은 배열로 필드를 구문 분석 얻을 수 있습니다 이 :

$data = Import-Csv c:\data.csv -Header colA, colB, colC, colD, colE -Delimiter '|' | Select-Object colA, colC 
$newdata += $data 
$newdata | convertto-csv -NoTypeInformation -Delimiter ',' | foreach-object {$_} | Out-File c:\newfile.csv 

이 나에게 난 후였다 두 필드를 줄 것이다, 그러나 나는 계산을 수행하고 새로운 CSV에 필요한 추가 하드 코딩 필드를 추가 할 수 없습니다.

나는 과거의 날에 인터넷 검색을 많이하고 여러 가지 방법을 시도해 왔지만 여전히 아무 곳에도 없습니다.

누구든지 도움을 줄 수 있습니까? 고맙습니다. 이 같은

+1

입력 및 원하는 출력을 위해 샘플 데이터를 추가하십시오. – vonPryz

+0

예제 데이터가 본체 위에 추가되었습니다. 형식을 유지하기 위해 강제 줄 바꿈을 사용하십시오. – gizmomelb

+0

@ gizmomelb 당신을 위해 그것을 고쳤습니다. 이제 귀하의 데이터로 내 대답을 시도 할 수 있습니다 – Matt

답변

2

뭔가 당신이 Select-Object 표현식이 한 라이너 만들 수 있지만 읽기가 많이 쉽게해야한다

$path = "E:\temp\sample.csv" 
$y2k = Get-Date -Date 1/1/2000 
Import-Csv $path -Header colA, colB, colC, colD, colE -Delimiter '|' | ForEach-Object{ 
    $colADate = [datetime]::ParseExact($_.ColA,"dd/MM/yyyy HH:mm:ss",[System.Globalization.CultureInfo]::InvariantCulture) 
    $minutesFromMidnight = $colADate.TimeOfDay.TotalMinutes 
    $daysSincey2k = New-TimeSpan -Start $y2k -End $colADate | Select-Object -ExpandProperty Days 
    [PSCustomObject][ordered]@{ 
     DaysSince = $daysSincey2k 
     MinutesSince = $minutesFromMidnight 
     ColA = $_.Cola 
     ColB = $_.Colb 
     ColC = $_.Colc 
     ColD = $_.Cold 
     ColE = $_.Cole 
    } 
} 

을 시작할 수 있습니다. 이 기능을 사용하려면 PowerShell 3.0 이상이 필요합니다. 당신이 그것을 가지고 있지 않다면 이것은 단지 약간의 조정이 필요할 것입니다. 이 데이터

DaysSince MinutesSince ColA    ColB ColC ColD ColE   
--------- ------------ ----    ---- ---- ---- ----   
    4018   860 01/01/2011 14:20:00 10 6 10 192.168.11.7 
    4018   865 01/01/2011 14:25:00 2 0 10 192.168.11.7 
    4018   870 01/01/2011 14:30:00 4 8 10 192.168.11.7 
    4018   875 01/01/2011 14:35:00 6 9 10 192.168.11.7 

하면 시간이 DateTime 객체로 변환하는 메소드 ParseExact를 사용하여 모두 같은 형식 인 경우

로 출력됩니다. 이를 통해 New-TimeSpan을 사용하여 시간의 차이를 확인할 수 있습니다. 계산 된 필드를 사용하여 사용자 정의 개체를 만들고 계산 된 데이터를 추가합니다.다음과 같이 내가 [pscustomobject]을 바꿀 것 당신이 찾고있는 정적 출력에 대한 댓글

뿐만 아니라이

작동합니다 2.0의 수출 CSV 전화

[PSCustomObject][ordered]@{ 
     DaysSince = $daysSincey2k 
     MinutesSince = $minutesFromMidnight 
     Five = 5 
     ColC = $_.Colc 
     One = 1 
     Text = "Text" 
     Bee = "B" 
     Zero = 0 
    } 
} | Export-Csv -Path c:\newfile.csv -NoTypeInformation 

을 추가하는

업데이트

$props = @{ DaysSince = $daysSincey2k MinutesSince = $minutesFromMidnight Five = 5 ColC = $_.Colc One = 1 Text = "Text" Bee = "B" Zero = 0 } New-Object PSObject -Property $props } | Select-Object DaysSince,MinutesSince,Five,ColC,One,Text,Bee,Zero | Export-Csv -Path c:\temp\newfile.csv -NoTypeInformation 
+0

제안/예제에 대한 고마워요. Colc, DaysSince 및 MinutesSince를 새 파일로 내보내거나 저장하려면 어떻게합니까? 그래서 내보내기 형식은 일 분, 5, ColC, 1, 텍스트, B, 0 감사합니다. – gizmomelb

+0

@gizmomelb가 입력 된 데이터로 업데이트되었습니다. 한번보세요 – Matt

+0

@Matt에게 감사드립니다 - 그 중 일부는 나에게도 의미가 있으므로 도움을 주셔서 대단히 감사합니다. 그러나 DaysSince, MinutesSince 및 colC 값을 새 CSV 파일에 저장하려고합니다.이 CSV 파일에는 각 행에 하드 코딩 된 필드가 추가되어 있습니다. 어떻게 접근합니까? 고맙습니다. – gizmomelb

관련 문제