【问题标题】:Build hash array in PowerShell在 PowerShell 中构建哈希数组
【发布时间】:2017-01-30 23:33:43
【问题描述】:

我正在读取一个由空白行分隔的 CSV 文件。我想在数组中捕获的空白行之间的每个部分。其中数组将类似于以下内容。

array[section0][row0]
array[section0][row1]
array[section0][row2]
array[section1][row0]
array[section1][row1]
array[section1][row2]

CSV 文件的格式类似于以下。

this,is,section,one,line,one
这,是,部分,一,行,二
,,,,,,,,,,,,,,,,,,,,,
这,是,节,二,线,一
这,是,部分,二,行,二
这,是,部分,二,行,三
部分,两个,带,额外,逗号,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,
这,是,节,三,线,一
这,是,部分,三,行,二
这,是,节,三,线,三
部分,三,带,额外,逗号,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,
这,是,节,四,线,一
这,是,部分,四,行,二
这,是,部分,四,行,三
部分,四,带,额外,逗号,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,

我正在尝试将数组放入$section[sectionnumber][sectionrownumber]。但这失败了。

我收到错误提示 “索引超出范围”“无法索引到空数组”

我确信这与数组初始化有关。我就是无法让它工作。

$file   = "filename"
$path   = Split-Path $file
$import = Get-Content $file

#find blank rows
$r = 0
$blank = "yes"
$firstblank = "yes"
$sectionnumber = 0
#initialize section array
$section = ,@()
foreach ($row in $import) {
    if ($row -ne ",,,,,,,,,,,,,,,,,,,,,") {
        #not a blank row
        if ($firstblank -eq "yes") {
            $blank = "no"
            $firstblank = "no"
        } elseif($blank -eq "yes") {
            $blank = "no"
            $r++
        } else {}
        #initialize array for multidemension
        $section[$r][$sectionnumber] = $row
        $sectionnumber++
    } else {
        #this is a blank row
        if ($blank = "no") {
            $blank = "yes"
            $sectionnumber = 0
        } else {
            $blank = "yes"
            $sectionnumber = 0
        }
    }
}
Write-Host $section

【问题讨论】:

    标签: arrays powershell csv


    【解决方案1】:

    如果您允许,PowerShell 可以为您完成大部分繁重的工作。这意味着您可能想要这样做。

    $import = Get-Content 'C:\path\to\your.txt' -Raw
    
    $section = [ordered]@{}
    $i = 0
    
    # remove trailing consecutive commas from the end of each line, then
    # split the lines at consecutive line breaks
    $import -replace '(?m),+$' -replace "`r?`n", "`n" -split "`n`n+" | Where-Object {
        # filter out blank lines
        $_.Trim()
    } | ForEach-Object {
        # for each text block create a new section with a nested hashtable,
        # then split each block into individual rows
        $j = 0
        $section["section$i"] = [ordered]@{}
        $_ -split "`n" | ForEach-Object {
            # split each row at commas and assign to a new record in the
            # nested hashtable
            $section["section$i"]["row$j"] = $_ -split ','
            $j++
        }
        $i++
    }
    

    请注意,对于有序哈希表和Get-Content -Raw,您需要 PowerShell v3 或更新版本。如果您仅限于 PowerShell v2 或更早版本,请删除 [ordered] 类型转换并将参数 -Raw 替换为 | Out-String


    编辑:如果您只想要一个简单的行列表,其中每行都带有部分和行标题,您可以像这样简化上面的内容:

    $import -replace '(?m),+$' -replace "`r?`n", "`n" -split "`n`n+" | Where-Object {
        $_.Trim()
    } | ForEach-Object {
        $j = 0
        $_ -split "`n" | ForEach-Object {
            "section $i - row $j - $_"
            $j++
        }
        $i++
    }
    

    【讨论】:

    • 这很有帮助,但不是我想要实现的目标。我正在努力写一个好的回应。但是“输入”试图在此处换行时会提交表单。所以我真的不能用这个评论做太多的事情来显示额外的信息。当我按下回车键时,您知道如何防止它自动提交此评论吗?
    • 我发布了更多信息作为答案,因为我无法弄清楚如何将其作为评论
    猜你喜欢
    • 1970-01-01
    • 2018-01-26
    • 2021-02-15
    • 2015-03-26
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多