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

如何检查中是否存在字符串:

  • 1个文本文件
  • 大小不超过10GB
  • 考虑到文件只有一行
  • 该文件仅包含随机数1到9
  • 使用powershell(因为我认为它会更高效,尽管我不知道如何用这种语言编程)
    我已经批量试用过:

    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
    ,并计算匹配项(将文件转换考虑在内)

    它还提供了删除或保留已拆分文件的功能