[英]Massive Replace text in files Source Control TFS using Powershell
[英]Powershell row counts to csv with massive text files
问候光荣的同志们,
我再次需要借用您的才华,使解决方案的能力最大化。
我必须使用powershell遍历大量文本文件(在某些情况下为20 GB)的目录,提取文件名,行数和创建日期,然后将该信息输出到csv中。
到目前为止,这是我的代码:
$fileEntries = [IO.Directory]::GetFiles("T:\frg\working");
foreach($fileName in $fileEntries)
{
$count = 0
$filedate = (Get-Date).Date
$reader = New-Object IO.StreamReader $filename
while($reader.ReadLine() -ne $null){$count++}
$reader.close()
#Get-Content $filename | %{$lines++}
[Console]::Writeline($filename+" "+$count+" "+ $filedate);
}
在获得文件创建日期之前,获取日期只是一个临时填充物。
当前输出类似于:
T:\frg\working\file1.txt 90055 03/06/2014 00:00:00
T:\frg\working\file2.txt 6419616 03/06/2014 00:00:00
但是对于我的一生,我无法成功将其通过管道传输到csv。
我尝试设置一个具有自定义属性的对象并将其输出,但是它说该管道为空。
文件的大小太大,无法使用Import-csv选项(将20GB导入内存会导致某些问题)。 如果我可以按扩展名进行过滤,也很整洁,但是如果没有扩展名,我可以解决它。
任何指针将不胜感激,在此先感谢您。
尝试这个:
$fileEntries = [IO.Directory]::GetFiles("T:\frg\working")
$RecordCounts =
foreach($fileName in $fileEntries)
{
$count = 0
$filedate = (Get-Date).Date
Get-Content $fileName -ReadCount 1000 |
foreach {$count += $_.count}
New-Object psobject -Property @{FileName = $fileName;Count = $count;FileDate = $filedate}
}
$RecordCounts | Export-Csv c:\somedir\RecordCounts.csv
编辑:针对超过1200万行的1GB文件测试3个发布的解决方案:
$testfile = 'c:\testfiles\bigfile.txt'
'Get-Content | Measure-Object'
(measure-command {
Get-Content $testfile |
Measure-Object -Line | select -expand Lines
}).TotalSeconds
''
'StreamReader'
(measure-command {
$count=0
$reader = New-Object IO.StreamReader $testfile
while($reader.ReadLine() -ne $null){$count++}
$reader.close()
}).TotalSeconds
''
'Get-Content -ReadCount'
(measure-command {
$count=0
Get-Content $testfile -ReadCount 1000 |
foreach {$count += $_.count}
}).TotalSeconds
Get-Content | Measure-Object
175.0600678
StreamReader
20.3832785
Get-Content -ReadCount
6.0199737
这就是我要做的:
gci *.txt | % {
$lineCount = gc $_ | Measure-Object -Line | select -expand Lines
select -InputObject $_ CreationTime, Name, @{Name="LineCount"; Expression={$lineCount}}
} | ConvertTo-Csv
根据我的测试,文件上的gc
似乎没有将整个文件加载到内存中(它必须使用一些流水线魔术),因此可能不需要编写自己的行计数器。
我在PS3中进行了测试。 文本文件之一是13GB。
这是这里几乎所有的代码...我在ForEach循环外将$Output
添加为空数组。 然后在循环中,我使用您指定的值创建一个自定义对象,并为每次通过将该对象添加到数组中。 最终,我在ForEach循环后最后使用Export-CSV将$Output
保存到CSV文件中。
$fileEntries = [IO.Directory]::GetFiles("T:\frg\working");
$OutPut = @()
foreach($fileName in $fileEntries)
{
$count = 0
$filedate = (Get-Date).Date
$reader = New-Object IO.StreamReader $filename
while($reader.ReadLine() -ne $null){$count++}
$reader.close()
#Get-Content $filename | %{$lines++}
[Console]::Writeline($filename+" "+$count+" "+ $filedate);
$Current = New-Object -TypeName PSObject -Property @{
FileName = $filename
Count = $count
FileDate = $filedate
}
$Output += $Current
}
$Output|Export-CSV C:\SomeFile.csv -notypeinfo
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.