2

ユーザー名と、残りのレコードの 1 つ以上の値を含む CSV があります。ファイルにヘッダーはありません。

joe.user,Accounting-SG,CustomerService-SG,MidwestRegion-SG
frank.user,Accounting-SG,EastRegion-SG

Username プロパティが最初の列に設定され、Membership プロパティが行の残りの部分 (カンマを含む) または理想的には各要素を含む文字列の配列に設定されている powershell オブジェクトにファイルを読み込みたい単一のメンバーシップ値を含みます。

残念ながら、次の行は最初のメンバーシップのみを取得し、行の残りを無視します。

$memberships = Import-Csv -Path C:\temp\values.csv -Header "username", "membership"
@{username=joe.user; membership=Accounting-SG}
@{username=frank.user; membership=Accounting-SG}

私はこれらの出力のいずれかを探しています:

@{username=joe.user; membership=Accounting-SG,CustomerService-SG,MidwestRegion-SG}
@{username=frank.user; membership=Accounting-SG,EastRegion-SG}

また

@{username=joe.user; membership=string[]}
@{username=frank.user; membership=string[]}

csvファイル内のデータの「残り」を引用符で囲むことで最初の結果を得ることができましたが、それは実際には最良の答えのようには感じません:

joe.user,"Accounting-SG,CustomerService-SG,MidwestRegion-SG"
4

1 に答える 1

3

問題は、あなたが持っているものが実際には (適切な) CSV ではないということです。CSV 形式はその表記をサポートしていません。

次のように、「独自にロール」して、ファイルを自分で処理することができます。

$memberships = Get-Content -LiteralPath C:\temp\values.csv |
    ForEach-Object -Process {
        $user,$membership = $_.Split(',')
        New-Object -TypeName PSObject -Property @{
            username = $user
            membership = $membership
        }
    }

あなたは半々のことをすることができます。グループがすべて引用符で囲まれた単一のフィールドである変更を使用して、次のようにします。

$memberships = Import-Csv -Path C:\temp\values.csv -Header "username", "membership" |
    ForEach-Object -Process {
        $_.membership = $_.membership.Split(',')
        $_
    }

最初の例では、ファイルを 1 行ずつ読み取り、コンマで分割してから、必要なプロパティを持つ新しいオブジェクトを作成します。

2 番目の例ではImport-Csv、最初にオブジェクトを作成するために使用し、次にプロパティをリセットし.membershipます (文字列として開始し、文字列を分割して配列にします)。

2番目の方法は、「CSV」を作成しているものが最初にその方法で作成できる場合にのみ意味があります。毎回自分で修正する必要がある場合は、これを飛ばしてそのまま処理してください。

于 2018-01-09T04:07:55.857 に答える