1

私の問題に対する次の解決策を求めてウェブを精査しました...現在、以下に示すように、いくつかの列に分割する必要があるcsv形式のテキストがあります

Task ID,Task Name,Project                   
2,2 - CR04AW212 Warehouse,2 Crown Castle International : 001586 2013 ALU Phase 3 Sprint Crown : 001623 CR04AW212 ALU Sprint                 
10,10 - CR04AW090 Tower Punch,24 Alcatel Lucent : 001713 2013 ALU AAV : 001752 CR04AW090 ALU AAV

そして、以下に示すように、テキストを引き離す複数の列に翻訳\ブレークダウンする必要があります

Task ID,Task Name,Customer ID,Customer Name,Parent Project ID,Parent Project Name,Child Project ID,Child Project Name
2,CR04AW212 Warehouse,2,Crown Castle International,001586,2013 ALU Phase 3 Sprint Crown 001623,CR04AW212 ALU Sprint
10,CR04AW090 Tower Punch,24,Alcatel Lucent,001713,2013 ALU AAV,001752,CR04AW090 ALU AAV

タスク ID 番号は、タスク名で再び繰り返されます。2番目の画像に示すように、名前からその番号を削除したいと思います

Project 列には、基本的に 6 つの列に分割するために必要なすべてのデータが含まれています。プログラムでテキストを選択する方法が必要だと思います。少しずつ入っていきます。「顧客 ID」列には、「プロジェクト列」の最初のスペースの前に数字が含まれている必要があります。これは、1 桁または 2 桁の数字で構成されます。関係なく、その番号は常に「プロジェクト」の最初の空白の前に存在する必要があります。明らかな初心者であるため、-splitパラメーターを使用してそれを達成できました

@{Name="Customer ID";Expression={($_.Project -split ' ')[0]}}.

ここで、最初のスペースの後、「:」の前に常に存在する次のテキスト「Customer Name」を選択する必要があります。

この例はあと 2 回続きます。「親プロジェクトID」と「子プロジェクトID」は6桁の固定数字です。各 ID に続くテキストは、そのプロジェクトの名前として表されます。

そして、これが私のグーグル検索が使い果たされた場所です

画像をアップロードしていないことをお詫びします。登録したばかりで、評判が十分になるまでStackOverflowは許可しません:)

編集: 最初の試合後に終了するにはどうすればよいですか?

Add-Member -PassThru NoteProperty 'Task Name' -Value ($_.'Task Name' -replace '\d+ - ')

現時点で私が持っていた場合

1,1 - JA03MR008 - Civil,9 New Tech Construction Corp. : 001583 2013 Panhandle : 001810 JA03MR008"

「タスク名」の最初の一致を削除したい場合、すべての一致が削除されます

タスク ID: 1
タスク名: JA03MRCivil
顧客 ID: 9
顧客名: New Tech Construction Corp.
親プロジェクト ID: 001583
親プロジェクト名: 2013 Panhandle
子プロジェクト ID: 001810
子プロジェクト名: JA03MR008

私はこのために REGEX の短期集中コースを受講しましたが、これが私の目的に最も適していると信じています。以下のコードを参照してください。それはうまくいくようです。このように使用する場合の注意点はありますか? 前もって感謝します

Add-Member -PassThru NoteProperty 'Task Name' -Value ($_.'Task Name' -replace '^([^-]*) - ')
4

1 に答える 1

1

この猫のスキンを作成する方法はおそらくたくさんあります。正規表現を使用して、入力オブジェクトのProjectプロパティを処理することをお勧めします。

@"
Task ID,Task Name,Project
2,2 - CR04AW212 Warehouse,2 Crown Castle International : 001586 2013 ALU Phase 3 Sprint Crown : 001623 CR04AW212 ALU Sprint
10,10 - CR04AW090 Tower Punch,24 Alcatel Lucent : 001713 2013 ALU AAV : 001752 CR04AW090 ALU AAV
"@ | ConvertFrom-Csv | ForEach-Object {
    if ($_.Project -match '(\d+) ([^:]+) : (\d+) ([^:]+) (: (\d+) (.*))?') {
        $_ | select 'Task ID' |
            Add-Member -PassThru NoteProperty 'Task Name' -Value ($_.'Task Name' -replace '\d+ - ') |
            Add-Member -PassThru NoteProperty 'Customer ID' -Value $Matches[1]                      |
            Add-Member -PassThru NoteProperty 'Customer Name' -Value $Matches[2]                    |
            Add-Member -PassThru NoteProperty 'Parent Project ID' -Value $Matches[3]                |
            Add-Member -PassThru NoteProperty 'Parent Project Name' -Value $Matches[4]              |
            Add-Member -PassThru NoteProperty 'Child Project ID' -Value $Matches[6]                 |
            Add-Member -PassThru NoteProperty 'Child Project Name' -Value $Matches[7]

    }
}

これはおそらくあちこちで磨く必要があるでしょう。たとえば、Add-Memberの代わりにselect-object+hashtablesを使用できます。v3の方がはるかに簡単ですが、これはv2と互換性がある必要があると思います。したがって、v3コードは使用されません。

編集: 子プロジェクトがない場合にオプションを処理できるコードでコードを更新しました。新しい正規表現:

 '(\d+) ([^:]+) : (\d+) ([^:]+) (: (\d+) (.*))?'

最後の2つの部分を作成しています:: (\d+)および(.*)オプション:(pattern)? $ Matches [5]は空白になるか、オプションのグループが含まれるため、子プロジェクトプロパティのインデックスを6と7に変更する必要があります。

于 2013-03-04T22:20:18.877 に答える