2016-07-29 3 views
1

версии CSV У меня есть два CSV-файлы, как например:Powershell сравнивающие

1) Records.csv

Account,TransactionDate,Description,Amount 
Acct1,1/1/2015,Shopping at Kohls,($35.00) 
Acct1,1/1/2016,Shopping at Target,($25.22) 
Acct1,1/1/2016,Shopping at Target,($60.00) 
Acct2,4/5/2015,Subway,($9.12) 
Acct2,1/1/2016,Jimmy Johns,($11.00) 
Acct3,1/1/2016,Shopping at Kohls,($35.00) 
Acct1,1/1/2016,Shopping at Kohls,$35.00 
Acct1,1/1/2016,Shopping at Target,($60.00) 
Acct2,4/5/2015,Subway,($9.12) 
Acct2,1/1/2016,Jimmy Johns,($11.00) 
Acct2,1/1/2016,Jimmy Johns,($11.00) 
Acct3,1/1/2016,Shopping at Kohls,($35.00) 
Acct3,1/1/2016,Kroger,($27.00) 

и 2) rules.csv:

Description,Category,Topic 
Shopping at Kohls,Misc,Clothing 
Subway,Food,Restaurants 
Jimmy Johns,Food,Restaurants 
Shopping at Target,Misc,Home 
Kroger,Food,Groceries 

мне нужно добавить категорию и тему из rules.csv в файл records.csv, на основе соответствующего описания.

Когда я запускаю следующий код, он работает, но добавляет всю строку в rules.csv в одно поле. Мне нужно добавить его в отдельные столбцы.

$rules = import-csv "rules.CSV" 
import-csv "Records.csv" | % { 
    $desc=$_.Description 
    $_ | Add-Member NoteProperty "Category" ($rules | select-string -SimpleMatch $desc) -PassThru 
} | export-csv "output.csv" -notype 

Результат выглядит так, но мне нужно разделить последний столбец.

"Account","TransactionDate","Description","Amount","Category" 
"Acct1","1/1/2015","Shopping at Kohls","($35.00)","@{Description=Shopping at Kohls; Category=Misc; Topic=Clothing}" 
"Acct1","1/1/2016","Shopping at Target","($25.22)","@{Description=Shopping at Target; Category=Misc; Topic=Home}" 
"Acct1","1/1/2016","Shopping at Target","($60.00)","@{Description=Shopping at Target; Category=Misc; Topic=Home}" 
"Acct2","4/5/2015","Subway","($9.12)","@{Description=Subway; Category=Food; Topic=Restaurants}" 
"Acct2","1/1/2016","Jimmy Johns","($11.00)","@{Description=Jimmy Johns; Category=Food; Topic=Restaurants}" 
"Acct3","1/1/2016","Shopping at Kohls","($35.00)","@{Description=Shopping at Kohls; Category=Misc; Topic=Clothing}" 
"Acct1","1/1/2016","Shopping at Kohls","$35.00 ","@{Description=Shopping at Kohls; Category=Misc; Topic=Clothing}" 
"Acct1","1/1/2016","Shopping at Target","($60.00)","@{Description=Shopping at Target; Category=Misc; Topic=Home}" 
"Acct2","4/5/2015","Subway","($9.12)","@{Description=Subway; Category=Food; Topic=Restaurants}" 
"Acct2","1/1/2016","Jimmy Johns","($11.00)","@{Description=Jimmy Johns; Category=Food; Topic=Restaurants}" 
"Acct2","1/1/2016","Jimmy Johns","($11.00)","@{Description=Jimmy Johns; Category=Food; Topic=Restaurants}" 
"Acct3","1/1/2016","Shopping at Kohls","($35.00)","@{Description=Shopping at Kohls; Category=Misc; Topic=Clothing}" 
"Acct3","1/1/2016","Kroger","($27.00)","@{Description=Kroger; Category=Food; Topic=Groceries}" 

Любой способ сделать это?

+0

Вы должны _ "разделить последний столбец ,"_ как? Вы хотите, чтобы «Категория» и «Тема» были вытащены? 'Описание' выглядит уже неповрежденным и присутствующим, так что вы также можете предоставить несколько строк того, что вы ожидаете, на выходе, чтобы просто сохранить время и любую путаницу? :) – gravity

+0

@ гравия спасибо. Да, мне нужно, чтобы категория и тема соответствовали описанию. Заголовками столбцов могут быть категории и темы. Я не хотел этого в этой записи массива, которую я показываю выше. Еще раз спасибо. –

ответ

2

использовали этот

https://github.com/RamblingCookieMonster/PowerShell/blob/master/Join-Object.ps1

$a = @' 
Account,TransactionDate,Description,Amount 
Acct1,1/1/2015,Shopping at Kohls,($35.00) 
Acct1,1/1/2016,Shopping at Target,($25.22) 
Acct1,1/1/2016,Shopping at Target,($60.00) 
Acct2,4/5/2015,Subway,($9.12) 
Acct2,1/1/2016,Jimmy Johns,($11.00) 
Acct3,1/1/2016,Shopping at Kohls,($35.00) 
Acct1,1/1/2016,Shopping at Kohls,$35.00 
Acct1,1/1/2016,Shopping at Target,($60.00) 
Acct2,4/5/2015,Subway,($9.12) 
Acct2,1/1/2016,Jimmy Johns,($11.00) 
Acct2,1/1/2016,Jimmy Johns,($11.00) 
Acct3,1/1/2016,Shopping at Kohls,($35.00) 
Acct3,1/1/2016,Kroger,($27.00) 
'@ | ConvertFrom-Csv 

$b = @' 
Description,Category,Topic 
Shopping at Kohls,Misc,Clothing 
Subway,Food,Restaurants 
Jimmy Johns,Food,Restaurants 
Shopping at Target,Misc,Home 
Kroger,Food,Groceries 
'@ | ConvertFrom-Csv 

Join-Object $a $b -LeftJoinProperty description -RightJoinProperty description 

# output: 
# Account TransactionDate Description  Amount Category Topic  
# ------- --------------- -----------  ------ -------- -----  
# Acct3 1/1/2016  Kroger    ($27.00) Food  Groceries 
# Acct2 4/5/2015  Subway    ($9.12) Food  Restaurants 
# Acct2 4/5/2015  Subway    ($9.12) Food  Restaurants 
# Acct1 1/1/2016  Shopping at Target ($25.22) Misc  Home  
# Acct1 1/1/2016  Shopping at Target ($60.00) Misc  Home  
# Acct1 1/1/2016  Shopping at Target ($60.00) Misc  Home  
# Acct2 1/1/2016  Jimmy Johns  ($11.00) Food  Restaurants 
# Acct2 1/1/2016  Jimmy Johns  ($11.00) Food  Restaurants 
# Acct2 1/1/2016  Jimmy Johns  ($11.00) Food  Restaurants 
# Acct1 1/1/2015  Shopping at Kohls ($35.00) Misc  Clothing 
# Acct3 1/1/2016  Shopping at Kohls ($35.00) Misc  Clothing 
# Acct1 1/1/2016  Shopping at Kohls $35.00 Misc  Clothing 
# Acct3 1/1/2016  Shopping at Kohls ($35.00) Misc  Clothing 

* редактировать: если вы не хотите использовать другой сценарий, это также должно работать

foreach ($record in $a) { 
    foreach ($obj in $b) { 
     if ($obj.description -eq $record.description) { 
      $record | select *, @{n='Category';e={$obj.Category}}, @{n='Topic';e={$obj.Topic}} 
     } 
    } 
} 
+0

Спасибо - это похоже на то, что мне нужно. Тем не менее, я такой новичок, я даже не знаю, как импортировать файл PS, чтобы эти функции были доступны. Разобраться в этом и попробовать через час - на Mac теперь и работать над другими вещами. Спасибо. –

+0

Нашел способ включить файл .ps1. В основном . . \ MyFunctions.ps1 Попробуй скоро. Спасибо. –

+0

Еще раз спасибо за помощь. Опираясь на меньший сценарий. Я попробовал, он отлично работает, за исключением того, что он не учитывает «записи», которые не имеют соответствующих «правил». Я попробовал поставить «else», но это не дало мне желаемого результата. В принципе, если в правилах csv нет соответствующих описаний, мы должны получить пустую категорию и тему. Надеюсь, это имеет смысл. Спасибо!! –

Смежные вопросы