我有一个非常大的文件需要处理(> 10 GB)。因此我使用StreamReader
and StreamWriter
。我的文件包含 CSV 格式的一系列金融市场价格,如下所示:
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();
所以,我在想是否可以查看 $data[0] (日期),找到这样的年份:
$thisYear = $data[0].Split("/")[2];
然后StreamWriter
为找到的每一年动态创建一个?我应该创建一个 StreamWriters 数组吗?问题是,在我阅读文件之前,我不知道文件中有多少年或哪些年。它必须“即时”完成。如果我正在阅读的文件包含十年的数据,我希望在最后创建十个流写入器,其中包含十个额外的文件,其中包含相应年份的数据。