2017-01-30 4 views
0

Я читаю CSV-файл, который разделен пустыми строками. Каждый раздел между пустыми строками, которые я хочу захватить в массиве. Где массив будет что-то вроде следующего.Build hash array в PowerShell

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 
this,is,section,one,line,two 
,,,,,,,,,,,,,,,,,,,,, 
this,is,section,two,line,one 
this,is,section,two,line,two 
this,is,section,two,line,three 
section,two,with,extra,commas,,,,,,,,,,,,,,,,,,,,, 
,,,,,,,,,,,,,,,,,,,,, 
,,,,,,,,,,,,,,,,,,,,, 
,,,,,,,,,,,,,,,,,,,,, 
this,is,section,three,line,one 
this,is,section,three,line,two 
this,is,section,three,line,three 
section,three,with,extra,commas,,,,,,,,,,,,,,,,,,,,, 
,,,,,,,,,,,,,,,,,,,,, 
,,,,,,,,,,,,,,,,,,,,, 
,,,,,,,,,,,,,,,,,,,,, 
this,is,section,four,line,one 
this,is,section,four,line,two 
this,is,section,four,line,three 
section,four,with,extra,commas,,,,,,,,,,,,,,,,,,,,, 
,,,,,,,,,,,,,,,,,,,,, 
,,,,,,,,,,,,,,,,,,,,, 
,,,,,,,,,,,,,,,,,,,,,

Я пытаюсь получить массив в $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 

ответ

0

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++ 
} 

Обратите внимание, что вам нужно PowerShell v3 или более поздней версии для упорядоченных и хэш-таблиц Get-Content -Raw. Если вы ограничены PowerShell v2 или ранее, удалите [ordered] и приложите -Raw к | Out-String.


Edit: Если вы хотите просто простой список строк, где каждая строка предваряется раздела и заголовка строки можно упростить выше, как это:

$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++ 
} 
+0

Это полезно, но не что я хотел достичь. Я пытаюсь написать хороший ответ. Но «введите», пытающийся перейти на новую строку, отправляет форму. поэтому я не могу много сделать с этим комментарием, чтобы показать дополнительную информацию. Вы знаете, как сохранить его от автоматического представления этого комментария, когда я нажимаю клавишу ввода? –

+0

Я отправил дополнительную информацию в качестве ответа, потому что я не мог понять, как это сделать в качестве комментария –