【发布时间】:2021-03-19 12:07:19
【问题描述】:
TL;DR:如何从“CSV 示例”创建一个类似“最终结果”的数组?
背景
我正在构建一个用于测试目的的实验室文件系统,并且我想创建一个看起来有点像真实文件系统的文件夹结构。我有几个包含文件夹信息的 CSV 文件。
CSV Example:
Department Level1 Level2 Level3
Human Resources Personnel Templates APAC
Job Applications Customer Relations EMEA
Salaries and Expenses Directors NA
Vacation Tracking Human Resources SA
Disputes Legal Services
Marketing
Production
Finance
IT Services
我想采用上面的每个组合并创建一个包含以下所有文件夹的文件系统。
End Result:
Human Resources\Personnel\Templates\APAC
Human Resources\Personnel\Templates\EMEA
...
Human Resources\Disputes\IT Services\NA
Human Resources\Disputes\IT Services\SA
一旦我有了上面所有完整路径的数组,就很简单了:
foreach($folder in $MyFolderArray){
New-Item "\\Server\Share$\$folder" -ItemType Directory -Force
}
问题
我希望能够对任何 CSV 文件执行此操作,无论我有多少列、标题名称是什么,或者每列有多少值。目前,我正在硬编码 4 个 foreach 循环,但该解决方案要求所有 CSV 文件具有相同数量的列和标题名称。我正在寻找可以采用任何列数和长度的任何 CSV 文件的东西。
从任何 CSV 获取所有标题可以这样完成:
$CSVContent = Import-CSV "C:\PathToMyCSVFile"
$CSVHeaders = $CSVContent[0].PSObject.Properties.Name
这可用于将 $CSVContent 拆分为每列一个数组:
for($i=0;$i -lt $CSVHeaders.Count;$i++){
New-Variable -Name "Header$i" -Value $($CSVContent.$($CSVHeaders[$i]) | Where-Object{$_ -ne ""})
}
这将创建从 $Header0 到 $Header# 的数组,其中 # 是 CSV 列数减 1,每个数组都包含该列中的所有值。从这些数组创建具有所有完整路径的最终数组是我卡住的地方。
问题
如何解决构建一个 foreach(foreach(... 循环,枚举所有值组合而不对其进行硬编码的逻辑?我猜这需要递归调用循环本身,但我不知道该怎么做。
【问题讨论】:
标签: arrays powershell csv