2013-02-08 3 views
1

У меня очень большой файл, необходимый для обработки (> 10 ГБ). Следовательно, мое использование StreamReader и StreamWriter. Мой файл содержит финансовый ряд рыночных цен в формате CSV, как это:Возможно построить динамический массив потоковедов в Powershell?

Date,Time,Open,High,Low,Close,UpVol,DownVol

Файл содержит года данных, и я хочу, чтобы создать один файл в год, и удалить последние два столбца. У меня есть сценарий, который делает это, если я пройду в Городе в качестве параметра. Я думал о вызове этого скрипта несколько раз, но ему нужно было бы прочитать очень большой файл несколько раз. Таким образом, я хочу только один раз прочитать файл и динамически переводить обработанные данные в разные файлы по строкам. Вот мой одногодичные сценарий:

param ( 
    [String]$file=$(throw "Supply a file name to convert"), 
    [String]$year 
    ); 

$extension = [System.IO.Path]::GetExtension($file); 
$outFile = $file.Substring(0, $file.LastIndexOf('.')) + "-" + $Year + $extension; 

$reader = [System.IO.File]::OpenText($file); 
$writer = New-Object System.IO.StreamWriter $outFile; 
$reader.ReadLine() > $null       # skip first line (old header) 
$writer.WriteLine("Date,Time,Open,High,Low,Close"); # write required header 
while (($line = $reader.ReadLine()) -ne $null) { 
    $data = $line.Split(","); 
    if ($data[0] -match $year) { 
     $writer.WriteLine($data[0] + "," + $data[1] + "," + $data[2] + "," + $data[3] + "," + $data[4] + "," + $data[5]); 
    } 
} 
$reader.Close(); 
$writer.Close(); 

Итак, я думаю, можно ли смотреть на $ данных [0] (дата), найти год с чем-то вроде этого:

$thisYear = $data[0].Split("/")[2];

, а затем динамически создать StreamWriter за каждый год, который был найден? Должен ли я создать массив StreamWriters? Snag, я не знаю, сколько лет или сколько лет в файлах, прежде чем я их прочитаю. Это нужно делать «на лету». Если файл, который я читаю, содержит десять лет данных, я ожидал бы, что десять создателей потока будут созданы с десятью дополнительными файлами в конце с данными соответствующего года в нем.

ответ

1

Я бы предложил хэш-таблицу для их хранения. Затем вы можете просто поискать год, чтобы найти своего потоковедателя. Попробуйте (непроверенный):

param ( 
    [String]$file=$(throw "Supply a file name to convert") 
    ) 

$extension = [System.IO.Path]::GetExtension($file) 
$writers = @{} 

$reader = [System.IO.File]::OpenText($file) 
$reader.ReadLine() > $null       # skip first line (old header) 
while (($line = $reader.ReadLine()) -ne $null) { 
    $data = $line.Split(",") 
    $thisYear = $data[0].Split("/")[2] 

    #If new year(no writer available) 
    if (!$writers.ContainsKey($thisYear)) { 
     #Create writer 
     $outFile = $file.Substring(0, $file.LastIndexOf('.')) + "-" + $thisYear + $extension 
     $writer = New-Object System.IO.StreamWriter $outFile 
     $writer.WriteLine("Date,Time,Open,High,Low,Close") 
     $writers.Add($thisYear, $writer) 
    } 

    $writers[$thisYear].WriteLine($data[0] + "," + $data[1] + "," + $data[2] + "," + $data[3] + "," + $data[4] + "," + $data[5]) 
} 
$reader.Close() 
$writers.GetEnumerator() | % { $_.Value.Close() } 
+0

Отлично! Благодарю. –

Смежные вопросы