【问题标题】:How can I use an array key in a powershell loop?如何在 powershell 循环中使用数组键?
【发布时间】:2019-03-21 23:02:56
【问题描述】:

我正在使用 PowerShell 读取并循环遍历 CSV 文件,以便为 CSV 文件的每一行创建一个新文件。我需要使用标题名称作为每个新文件的一部分。

对于 CSV 的每一行,如何循环遍历每一列并在每个新文件的输出中输出每个变量的键和值?

例如,如果 Master.csv 包含

a,b,c
1,2,3
4,5,6

我想输出一个名为 file1.txt 的文件:

a=1
b=2
c=3

还有一个名为 file2.txt 的文件:

a=4
b=5
c=6

将数组转换为哈希表并使用 $d.Keys 之类的东西有好处吗?

我正在尝试以下方法,但无法获取密钥:

Import-Csv "C:\Master.csv" | %{
    $CsvObject = $_
    Write-Output "Working with $($CsvObject.a)"
    $CsvObject | ForEach-Object { 
        Write-Output "Key = Value`n" 
    }
}

【问题讨论】:

    标签: powershell hashtable


    【解决方案1】:

    这似乎可以完成这项工作。 [grin] 它使用隐藏的.PSObject 属性来遍历每个对象的属性。

    # fake reading in a CSV file
    #    in real life, use Import-CSV
    $Instuff = @'
    a,b,c
    1,2,3
    4,5,6
    '@ | ConvertFrom-Csv
    
    $Counter = 1
    
    foreach ($IS_Item in $Instuff)
        {
        $FileName = "$env:TEMP\HamletHub_File$Counter.txt"
        $TextLines = foreach ($Prop in $IS_Item.PSObject.Properties.Name)
            {
            '{0} = {1}' -f $Prop, $IS_Item.$Prop
            }
    
        Set-Content -LiteralPath $FileName -Value $TextLines
    
        $Counter ++
        }
    

    HamletHub_File1.txt 内容...

    a = 1
    b = 2
    c = 3
    

    【讨论】:

    • 根据数据集的大小使用Add-Content 对键进行每次迭代可能会减少内存使用量。
    • @hsimah - 这不是更多的写作吗?与脚本的其余部分相比,写入速度较慢...
    • 它会产生更多的写入并且会减慢它的速度。但是,如果您要处理大量 CSV 中的数百万行,则可能需要权衡速度。
    • @hsimah - 啊!这是有道理的......谢谢你澄清这一点! [咧嘴]
    • 谢谢,文件不是很大,我会测试上面的
    猜你喜欢
    • 1970-01-01
    • 2023-02-02
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 2020-08-29
    • 2012-02-09
    相关资源
    最近更新 更多