我有一个目录,其中包含大约10&000,000个不同长度的文本文件。超过1GB。
我需要提取每个文件的第一行并将其插入到同一目录中的新文本文件中。
我尝试过常用的MS-DOS批处理文件方法,由于文件太大而导致崩溃。
有没有办法在Powershell中使用Streamreader进行此操作?
答案 0 :(得分:4)
编辑:当然是以内置的方式:
$firstLine = Get-Content -Path $fileName -TotalCount 1
[Ack Raf的评论]
原件:
我建议查看File.ReadLines
:这个方法懒惰地读取文件的内容 - 只读取返回的枚举器上每次迭代的内容。
我不确定Select-Object -first 1
是否会在一行之后主动暂停管道,如果确实如此,那么这是获取第一行的最简单方法:
$firstLine = [IO.File]::ReadLines($filename, [text.encoding]::UTF8) | Select-Object -first 1
否则就像:
$lines = [IO.File]::ReadLines($filename, [text.encoding]::UTF8); # adjust to correct encoding
$lineEnum = $lines.GetEncumerator();
if ($lineEnum.MoveNext()) {
$firstLine = $lineEnum.Current;
} else {
# No lines in file
}
NB。这假定至少PowerShell V3使用.NET V4。
答案 1 :(得分:3)
为了只读一行,您还可以使用:
$file = new-object System.IO.StreamReader($filename)
$file.ReadLine()
$file.close()
使用OutVariable,您可以将其写在一行:
$text = (new-object System.IO.StreamReader($filename) -OutVariable $file).ReadLine();$file.Close()
答案 2 :(得分:2)
短而甜蜜:
cd c:\path\to\my\text\files\
Get-Content *.txt -First 1 > output.txt
编辑2018年11月:根据文档," TotalCount参数将检索限制在前n行。"这似乎是最小化资源使用。自己测试并添加你的评论。
cd c:\path\to\my\text\files\
Get-Content *.txt -TotalCount 1 > output.txt