2016-12-16 1 views
1

Моя проблема в том, что мне нужно разделить файл, который является только 1 строкой, но очень длинным. Я пытаюсь запустить (cat $filename).split("'") , но это дает мне исключение outofmemory. Есть ли способ просмотреть файл, который он не пытается загрузить файл сразу, поэтому я могу разделить одну строку. Для справки размер файла, о котором идет речь, составляет 46 МБ.Исключение версии Powershell out of memory в длинном однострочном файле

+0

Что-то вроде этого, вероятно, будет полезно http://stackoverflow.com/questions/4533570/in-powershell-how-do-i-split-a-large-binary-file – DejaVuSansMono

+0

несколько странно, что файл размером 46 МБ выбрасывая исключение из памяти, является '(cat $ filename) .split (" '")' всего вашего кода или есть другие операции? –

+0

Извините, должно было добавить остальную часть того, что я делал здесь, где {$ _ -match "'^EQD | '^ MEA"} out-file -encoding default work/templist – Adlis

ответ

1

У меня была аналогичная проблема, работающая с большими файлами пару лет назад. Если предположить, что ни один из отдельных строк не превышает предельный размер, это должно работать:

$InputFileName = 'C:\Temp\Temp.txt' 
$StreamReader = New-Object System.IO.StreamReader($InputFileName, [System.Text.Encoding]::ASCII) 
$Queue = New-Object System.Collections.Generic.Queue[char] 
[string[]]$Array = @() 
while ($StreamReader.EndOfStream -ne $True) 
    { 
    $CurrentChar = $StreamReader.Read() 
    if ($CurrentChar -eq [char]"'") 
     { 
     [string]$Element = '' 
     while ($Queue.Count -gt 0) 
      { 
      $Element += $Queue.Dequeue() 
      } 
     $Array += $Element 
     } 
    else 
     { 
     $Queue.Enqueue($CurrentChar) 
     } 
    } 
$StreamReader.Close() 

Это создает первую в коллекцию, первый выход (FIFO), что очереди ваших персонажей, пока ' не встречаются. Затем очереди символов считываются в строку, которая добавляется в массив.

+0

Да, я закончил делать что-то подобное, но это занимает много времени, но я ничего не могу сделать, потому что баран по какой-то причине был действительно низким на компьютере, который я использовал – Adlis