web-dev-qa-db-ja.com

PowerShellでCsvファイルを読み取り、対応するデータをキャプチャします

PowerShellを使用して、ユーザー入力をキャプチャし、入力をカンマ区切りのCSVファイル内のデータと比較し、対応するデータを変数に書き込みます。

例:

  1. ユーザーは「Store_Number」の入力を求められ、「10」と入力します。
  2. 入力「10」は、CSVファイルの最初の位置または列のデータと比較されます。
  3. 対応する位置/列の「District_Number」などのデータがキャプチャされ、変数に書き込まれます。

この方法でExcelファイル(.xlsx)を操作できるようになりましたが、非常に遅いことがわかりました。 PowerShellがCSVファイルをより効率的に読み取ることができることを願っています。

CSVファイルの例へのリンク here

Store_Number,Region,District,NO_of_Devices,Go_Live_Date
1,2,230,10,2/21/2013
2,2,230,10,2/25/2013
3,2,260,12,3/8/2013
4,2,230,10,3/4/2013
5,2,260,10,3/4/2013
6,2,260,10,3/11/2013
7,2,230,10,2/25/2013
8,2,230,10,3/4/2013
9,2,260,10,5/1/2013
10,6,630,10,5/23/2013
13
squishy79

見ておくべきはImport-Csvです

CSVをインポートしたら、列ヘッダーを変数として使用できます。

CSVの例:

Name  | Phone Number | Email
Elvis | 867.5309     | [email protected]
Sammy | 555.1234     | [email protected]

次に、CSVをインポートし、リストをループして配列に追加します。次に、入力された値を配列と比較できます。

$Name = @()
$Phone = @()

Import-Csv H:\Programs\scripts\SomeText.csv |`
    ForEach-Object {
        $Name += $_.Name
        $Phone += $_."Phone Number"
    }

$inputNumber = Read-Host -Prompt "Phone Number"

if ($Phone -contains $inputNumber)
    {
    Write-Host "Customer Exists!"
    $Where = [array]::IndexOf($Phone, $inputNumber)
    Write-Host "Customer Name: " $Name[$Where]
    }

出力は次のとおりです。

I Found Sammy

14
Austin T French

古いトピックですが、明確に答えられたことはありません。私も同様に取り組んでおり、解決策を見つけました:

このオースティンからのコードサンプルのパイプ(|)は区切り文字ではありませんが、ForEach-Objectをパイプするため、区切り文字として使用する場合は、これを行う必要があります。

Import-Csv H:\Programs\scripts\SomeText.csv -delimiter "|" |`
ForEach-Object {
    $Name += $_.Name
    $Phone += $_."Phone Number"
}

何が起こっているのかを理解する前に、これに15分ほど費やしました。答えが、これを読んでいる次の人が無駄な時間を避けるのに役立つことを願っています! (オースティンのコメントを拡大して申し訳ありません)

9
Nils E Lie

それで、私はこの声明の何が悪いのかを見つけました。

Import-Csv H:\Programs\scripts\SomeText.csv |`

(元の)

Import-Csv H:\Programs\scripts\SomeText.csv -Delimiter "|"

(提案、引用符を使用する必要があります;それ以外の場合、それは機能せず、ISEはエラーを表示します)

変数にアイテムの配列を設定するには、-Delimiter "|"が必要です。それ以外の場合、Powershell ISEはアイテムのリストを表示しません。

|演算子を推奨すると言うことはできません。これは、コマンドレットを相互にパイプするために使用されるためです。

まだtrueを返し、プロンプトを介して入力された値を出力するifステートメントを取得できません。

他の誰かが助けることができれば、それは素晴らしいことです。私はまだ投稿に感謝しています、それは非常に役に立ちました!

6
ez4sheezee