Строка PowerShell заменить работает медленно - PullRequest
0 голосов
/ 18 мая 2019

У меня есть файл, разделенный табуляцией, например:

tyuy    wqf fdfd
zx c    vbn 733t 601    asd

Последняя строка похожа на zx c[tab]vbn[tab]733t 601[tab]asd.

Мне нужно обрезать данные перед первой вкладкой в ​​файле 2 Гб с примерно 100символов в строке.

Я хочу копировать содержимое файла построчно после первой вкладки

wqf fdfd
vbn 733t 601    asd

Я написал скрипт, который работает с небольшими тестовыми файлами

 powershell -Command "(gc in.txt) -replace '^[^\t]+\t' , '$1' | Out-File -encoding ASCII  out.txt"

Однако он занимал 10 Гб памяти и занимал часы для запуска.Есть ли способ сделать этот скрипт быстрее?Файл bat для cmd.exe тоже подойдет.Python и Perl не могут быть установлены на этом компьютере.

Ответы [ 2 ]

3 голосов
/ 18 мая 2019

Я бы использовал оператор -split, чтобы получить деталь после первого символа табуляции.
Поскольку вы работаете с большим файлом, эти параметры могут работать лучше для вас:

  1. Использование [System.IO.File]::ReadLines

    foreach ($line in [System.IO.File]::ReadLines("D:\in.txt")) {
        Add-Content -Path 'D:\out.txt' -Value ($line -split '\t', 2 )[-1]
    }
  2. Но, возможно, быстрее, используя StreamReader и StreamWriter

    $reader = New-Object System.IO.StreamReader("D:\in.txt")
    $writer = New-Object System.IO.StreamWriter("D:\out.txt")
    while (($line = $reader.ReadLine()) -ne $null) {
        $writer.WriteLine(($line -split '\t', 2 )[-1])
    }
    $reader.Dispose()
    $writer.Dispose()
1 голос
/ 18 мая 2019

Get-Content неэффективно для больших файлов. Использование методов класса .NET System.IO.File - лучший способ.

Проверьте эту статью для сравнения различных методов: Чтение больших текстовых файлов с помощью Powershell

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...