Powershell-使用CSV创建多个文本文件



我正在尝试创建一个PS脚本,该脚本使用CSV文件作为输入自动生成txt文件。

CSV文件包含以下数据:

定价红色自行车是是红色汽车是
类别 产品
自行车
自行车 蓝色自行车
自行车 黑色自行车 No
汽车No
汽车 蓝色汽车

这里有一个可能的解决方案:

# Group CSV data by column Category and loop over groups
Import-CSV -Path path.csv -Delimiter ";" | Group-Object Category | ForEach-Object {
# Create a text file from the current group
$fileName = "$($_.Name).txt"
Set-Content $fileName -Value "$($_.Name) file contains:"
# Loop over the rows of the CSV and add the data to the txt file
$_.Group | ForEach-Object {
# Format one line of the current text file
($_.Product, $_.Priced) -join ' - '
} | Add-Content $fileName
}

输出:

Bike.txt

Red bike - Yes
Blue bike - Yes
Black bike - No

Car.txt

Red car - No
Blue car - Yes

详细说明:

Group-Object命令根据指定的条件对数据进行分组,在本例中为属性(列(Category的值。为了更好地理解它是如何工作的,它有助于删除ForEach-Object命令:

Import-CSV -Path path.csv -Delimiter ";" | Group-Object Category

该输出:

Count Name Group
----- ---- -----
3 Bike {@{Category=Bike; Product=Red bike; Priced=Yes}, @{Category=Bike; Product=Blue bike; Priced=Yes}, @{Category=Bike;…
2 Car  {@{Category=Car; Product=Red car; Priced=No}, @{Category=Car; Product=Blue car; Priced=Yes}}

因此,对于每个组(BikeCar(,它输出一个对象,该对象具有属性Count(分组对象的数量(、Name(分组所依据的属性值(和Group(分组对象阵列(。

因此,当对Group-Object的输出进行迭代时,ForEach-Object脚本块会被每组调用一次。在这个级别上,将创建文件。

然后,我们迭代Group数组的元素,该数组包含当前类别的CSV行,以创建文件的行,并使用-join运算符格式化每一行。这最终会出现在文件中,因为它是隐式输出,通过管道传输到下一个命令。

最后通过管道将文件输出到Set-Content。如有必要,请使用-Encoding参数指定非默认编码(PS 5.x默认为ANSI,而PS 7.x默认为UTF-8(。

最新更新