18

使用 PowerShell 我想捕获用户输入,将输入与逗号分隔的 CSV 文件中的数据进行比较,并将相应的数据写入变量。

例子:

  1. 提示用户输入“<code>Store_Number”,他们输入“ 10”。
  2. 然后将输入“<code>10”与 CSV 文件的第一个位置或列中的数据进行比较。
  3. 捕获相应位置/列中的“<code>District_Number”等数据并将其写入变量。

我已经让这种方法与 Excel 文件 (.xlsx) 一起使用,但发现它非常慢。希望 PowerShell 可以更有效地读取 CSV 文件。

链接到此处的示例 CSV 文件:

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
4

3 回答 3

23

您应该查看的是 Import-Csv

导入 CSV 后,您可以使用列标题作为变量。

示例 CSV:

Name  | Phone Number | Email
Elvis | 867.5309     | Elvis@Geocities.com
Sammy | 555.1234     | SamSosa@Hotmail.com

现在我们将导入 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]
    }

这是输出:

我找到了萨米

于 2013-05-22T04:14:29.257 回答
13

老话题,但从未明确回答。我也一直在做类似的工作,并找到了解决方案:

这个来自 Austin 的代码示例中的管道 (|) 不是分隔符,而是用于管道 ForEach-Object,因此如果要将其用作分隔符,则需要这样做:

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

在我明白发生了什么之前,我自己花了 15 分钟来解决这个问题。希望答案能帮助下一个阅读本文的人避免浪费时间!(抱歉扩展您的评论奥斯汀)

于 2017-06-13T07:47:13.747 回答
7

所以我弄清楚了这个陈述有什么问题:

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

(原来的)

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

(建议,您必须使用引号;否则,它将不起作用并且 ISE 会给您一个错误)

它需要-Delimiter "|", 以便用项目数组填充变量。否则,Powershell ISE 不会显示项目列表。

我不能说我会推荐该|运算符,因为它用于将 cmdlet 相互传递。

我仍然无法让 if 语句返回 true 并输出通过提示输入的值。

如果其他人可以提供帮助,那就太好了。我仍然感谢这篇文章,它非常有帮助!

于 2013-10-17T21:43:06.330 回答