我正在尝试创建一个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}}
因此,对于每个组(Bike
、Car
(,它输出一个对象,该对象具有属性Count
(分组对象的数量(、Name
(分组所依据的属性值(和Group
(分组对象阵列(。
因此,当对Group-Object
的输出进行迭代时,ForEach-Object
脚本块会被每组调用一次。在这个级别上,将创建文件。
然后,我们迭代Group
数组的元素,该数组包含当前类别的CSV行,以创建文件的行,并使用-join
运算符格式化每一行。这最终会出现在文件中,因为它是隐式输出,通过管道传输到下一个命令。
最后通过管道将文件输出到Set-Content
。如有必要,请使用-Encoding
参数指定非默认编码(PS 5.x默认为ANSI,而PS 7.x默认为UTF-8(。