String 在大文件中高效地搜索字符串
如何检查中是否存在字符串:String 在大文件中高效地搜索字符串,string,powershell,search,String,Powershell,Search,如何检查中是否存在字符串: 1个文本文件 大小不超过10GB 考虑到文件只有一行 该文件仅包含随机数1到9 使用powershell(因为我认为它会更高效,尽管我不知道如何用这种语言编程) 我已经批量试用过: FINDSTR "897516" decimal_output.txt pause 但正如我所说,我需要更快、更有效的方法来实现这一点 我还尝试了在stackoverflow中找到的以下代码: $SEL = Select-String -Path C:\Users\fabio\Des
我已经批量试用过:
FINDSTR "897516" decimal_output.txt
pause
但正如我所说,我需要更快、更有效的方法来实现这一点
我还尝试了在stackoverflow中找到的以下代码:
$SEL = Select-String -Path C:\Users\fabio\Desktop\CONVERTIDOS\dec_output.txt -Pattern "123456"
if ($SEL -ne $null)
{
echo Contains String
}
else
{
echo Not Contains String
}
但是我得到了下面的错误,我不知道这段代码是最可靠的还是足够的。错误:
选择字符串:Tipo de exepço'System.OutOfMemoryException'accionado。
在C:\Users\fabio\Desktop\1.ps1:1 char:8
+$SEL=选择字符串-路径C:\Users\fabio\Desktop\CONVERTIDOS\dec\u out。。。
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+CategoryInfo:NotSpecified:(:)[选择字符串],OutOfMemoryException
+FullyQualifiedErrorId:System.OutOfMemoryException,Microsoft.PowerShell.Commands.SelectStringCommand
这应该可以做到:
#################################################################################################################
#
#在$input_文件中搜索用户定义的字符串并统计匹配项。可以处理任何大小的文件。
#
#调整源目录和输入文件名。
#
$source=“C:\adjust\path”
$input\u file=“file\u name.extension”
#
#
#定义要搜索的字符串。即使只搜索数字,也要保留引号(否则
#$pattern.Length将为1,并且此脚本将不再适用于大于$split_大小的文件)!
#
$pattern=“在此处输入要搜索的字符串”
#
#
#对大小为1GB或更大的输入文件使用Get Content将导致System.OutOfMemoryExceptions,
#因此,一个大文件会被临时拆分。
#
$split\u大小=100MB
#
#
#谢谢@Bob(https://superuser.com/a/1295082/868077)
#################################################################################################################
设置位置$source
if(测试路径“\\分割”){
而($overwrite-ne“true”-和$overwrite-ne“false”){
“`n”
$overwrite=读取主机“已拆分文件/仍存在!是否删除并覆盖?”
如果($覆盖-匹配“y”){
$overwrite=“true”
删除项目。\\ u拆分-强制-递归
$a=“`n已删除已拆分的现有文件!”
}elseif($overwrite-match“n”){
$overwrite=“false”
$a=“`n继续处理现有拆分文件!”
}elseif($覆盖-匹配“c”){
出口
}否则{
写入主机“`n错误:无效输入!`n键入“y”表示“是”。键入“n”表示“否”。键入“c”表示“取消”。`n`n`n”
}
}
}
清除主机
if((获取项目$input\u文件).Length-gt$split\u size){
而($delete-ne“true”-和$delete-ne“false”){
“`n”
$delete=读取主机“以后删除分割的文件?”
如果($删除-匹配“y”){
$delete=“true”
$b=“`n分割的文件将在以后删除!”
}elseif($delete-匹配“n”){
$delete=“false”
$b=“`n分割后的文件将不会被删除!”
}elseif($删除-匹配“c”){
出口
}否则{
写入主机“`n错误:无效输入!`n键入“y”表示“是”。键入“n”表示“否”。键入“c”表示“取消”。`n`n`n”
}
}
清除主机
一美元
b美元
写主机'n这可能需要一些时间!
如果($overwrite-ne“false”){
新项目-项目类型目录-路径“\\u split”>$null 2>&1
[环境]::CurrentDirectory=获取位置
$bytes=新对象字节[]4096
$in_file=[System.IO.file]::OpenRead($input_file)
$file\u count=0
$finished=$false
而(!$finished){
$file\u计数++
$bytes\u to\u read=$split\u size
$out\u file=New Object System.IO.FileStream“\\u split\\u split\u$file\u count.splt”,CreateNew,Write,None
while($bytes\u to\u read){
$bytes_read=$in_file.read($bytes,0,[Math]::Min($bytes.Length,$bytes_to_read))
如果(!$bytes\u读取){
$finished=$true
打破
}
$bytes\u to\u read-=$bytes\u read
$out\u file.Write($bytes,0,$bytes\u read)
}
$out_file.Dispose()
}
$in_file.Dispose()
}
$i++
while(测试路径“\\u split\\u split\$i.splt”){
$cur\u file=(获取内容“\\u split\\u split\u$i.splt”)
$temp_count=([regex]::匹配($cur_文件,“$pattern”)).count
$match_count+=$temp_count
$n=$i-1
if(测试路径“\\u split\\u split\$n.splt”){
if($cur_file.Length-ge$pattern.Length){
$file_transition=$prev_file.Substring($prev_file.Length-($pattern.Length-1))+$cur_file.Substring(0,($pattern.Length-1))
}否则{
$file\u transition=$prev\u file.Substring($prev\u file.Length-($pattern.Length-1))+$cur\u file
}
$temp_count=([regex]::匹配($file_transition,“$pattern”)).count
$match_count+=$temp_count
}
$prev_文件=$cur_文件
$i++
}
}否则{
一美元
$match_count=([regex]::Matches($input_file,“$pattern”)).count
}
如果($delete-eq“true”){
删除项目“\\u拆分”-强制-递归
}
如果($match_count-ge 1){
写入主机“`n`n String'$pattern'找到:`n`n$match\u count matches!”
}否则{
写入主机“`n`n字符串'$pattern'未找到!”
}
写入主机`n`n`n`n`n
暂停
这将把一个大文件拆分为多个小文件,搜索它们以查找$pattern
,并计算匹配项(将文件转换考虑在内)
它还提供了删除或保留已拆分文件的功能