1

処理する必要がある非常に大きなファイルがあります (> 10 GB)。したがって、私の使用StreamReaderStreamWriter。私のファイルには、次のような CSV 形式の一連の金融市場価格が含まれています。

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

ファイルには何年ものデータが含まれており、年ごとに 1 つのファイルを作成し、最後の 2 つの列を削除したいと考えています。年をパラメーターとして渡すと、これを行うスクリプトがあります。このスクリプトを複数回呼び出すことを考えましたが、非常に大きなファイルを複数回読み取る必要があります。そのため、ファイルを一度だけ読み取り、処理されたデータを行ごとに動的に別のファイルにストリーミングしたいと考えています。これが私の単年スクリプトです。

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();

だから、私は $data[0] (日付) を見て、次のようなもので年を見つけることができると考えています:

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

そして、StreamWriter見つかった年ごとに動的に作成しますか? StreamWriter の配列を作成する必要がありますか? 問題は、ファイルを読む前に、ファイルに何年またはどの年が含まれているかわかりません。「オンザフライ」で実行する必要があります。私が読んでいるファイルに 10 年分のデータが含まれている場合、10 個のストリームライターが作成され、最後にそれぞれの年のデータを含む 10 個の追加ファイルが作成されると予想されます。

4

1 に答える 1

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() }
于 2013-02-08T14:46:09.550 に答える