2014-04-06 9 views
0

'Column1'열 아래에 'input'을 하위 행으로 포함하고 있지만 연속 된 형식이 아닌 많은 행이 있습니다. 이 유형이 발생할 때마다 동일한 행의 다른 열에 'some data'값을 넣고 싶습니다. 이렇게해야합니다. CSV 파일 데이터 조작

Column1      Column2 
This function takes input.  
Other value     don't care 
String as input    old_data 

Column1      Column2 

This function takes input.  new_data 
Other value     don't care 
String as input    old_data, new_data 

열이 단순히 데이터를 추가해야하지만 이미 일부 old_data을 포함하는 경우, 그것은 new_data는 쉼표 (,)로 구분 추가해야 비어있는 경우

. PowerShell 또는 다른 방법을 사용하여이 작업을 자동화 할 수있는 방법이 있습니까?

수정 도움을 주시면 코드를 수정하여 다음과 같이 표시됩니다. column3의 값에 'input'이 포함되어있는 경우 5 번 열에 이미 데이터 (단어 문자 또는 ',')가 있는지 확인했습니다. if 문에는 문제가 있습니다.

$path = "d:\Book.csv" 
$data = Import-Csv $path 

$check = "ACCESS" 
$new_value = "access" 

$data | ForEach-Object { 
    if($_.Column3 -match 'ACCESS'){ 
    if($_.Column5.Trim() -eq "") { 
     $_.Column5 = $newvalue 
    } elseif ($_.Column5 -match [\w,]) { 
     $_.Column5 += "; $newvalue" 
    } 
} 
} 

$data | Export-Csv d:\Book11.csv -NoTypeInformation 

답변

2

다음에 몇 가지 작업을 표시하십시오. 너는 무엇을 시도 했는가? 키워드는 Import-CSV, Export-CSVForeach-Object/%입니다. 수정 후

#Sample csv 
$data = @" 
Column1,Column2 
This function takes input., 
Other value,don't care 
String as input,old_data 
"@ | ConvertFrom-Csv 

#To import a real csv-file, uncomment the lines below 
#$path = "c:\mydata.csv" 
#$data = Import-Csv $path 

$oldvalue = "old_data" 
$newvalue = "new_data" 

$data | ForEach-Object { 
    if($_.Column2.Trim() -eq "") { 
     $_.Column2 = $newvalue 
    } elseif ($_.Column2 -match [regex]::Escape($oldvalue)) { 
     $_.Column2 += ", $newvalue" 
    } 
} 

$data | Export-Csv $path -NoTypeInformation 

데이터 : 신속한 대답에 대한

PS C:\Users\Frode> $data | ConvertTo-Csv -NoTypeInformation 

"Column1","Column2" 
"This function takes input.","new_data" 
"Other value","don't care" 
"String as input","old_data, new_data" 
+0

감사 :

$data | ft -AutoSize Column1 Column2 ------- ------- This function takes input. new_data Other value don't care String as input old_data, new_data 

귀하의 CSV 파일이 같이 표시됩니다. 나는 한 가지 의심이있다. 정규 표현식에서 ':: Escape'의 목적은 무엇입니까? 나는 그것을 찾았지만 찾을 수 없었다. –

+0

Export-Csv : 'InputObject'매개 변수가 null이므로 바인딩 할 수 없습니다. D : \ BTP \ manipulate.ps1 : 26 char : 19 + $ data | 내보내기-CSV <<<< D : \ Book11.csv -NoTypeInformation + CategoryInfo : InvalidData (:) [내보내기-CSV, ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed, Microsoft.PowerShell.Commands.ExportCsvCo mmand –

+0

'-match '는 문자열이 정규식 패턴과 일치하는지 검사하는 연산자입니다. 특정 텍스트와 일치하기를 원하기 때문에 '와 같은 특수 문자를 이스케이프 처리해야합니다.() \ [] {} +?'등.'$ data | export-csv'를 입력하면'$ data'는 비어 있습니다. 이것은 아마도 처음부터 가져온 적이 없다는 뜻입니다. 샘플이 작동합니다. '$ path' 변수를 파일로 변경하고'$ path ='및'$ data = import'로 시작하는 줄의 주석 처리를 제거하십시오. –