Разделить текстовый файл с помощью Powershell - PullRequest
0 голосов
/ 10 июля 2020

Я пытаюсь разделить текстовый файл на основе нескольких строк на два файла с помощью Powershell. Размеры файлов варьируются от 5 КБ до 15 КБ.

Данные файла отформатированы, например, ниже:

18600 - ABCD 2204 2020-04-11 00:00: 00

18600 - ABCD 2204 2020-04-11 00: 00: 00

18600 - ABCD 2204 2020-04-11 00: 00: 00

18113 - ABCD 2204 2020-04-11 00 : 00: 00

18113 - ABCD 2204 2020-04-11 00: 00: 00

19873 - ABCD 2204 2020-04-11 00: 00: 00

18764 - ABCD 2204 2020-04-11 00: 00: 00

19000 - ABCD 2204 2020-04-11 00: 00: 00

Мне нужно разбить все строки, начинающиеся с 18600 , 18113, 19000, и др. c. (или любой набор указанных 5 цифр) в один файл, а все оставшиеся строки данных, которые не начинаются с этих чисел (else), во второй файл.

Итак, logi c равно, Для каждой строки в файле, если он начинается с этих наборов указанных чисел, напишите в «file1», иначе запишите его в «file2».

$file = (Get-Content myfile.txt)
ForEach ($line in $file) {
  If ($line -match a set of strings) 
{
$newfile = all lines with set of beginning strings
}
Else {
$line | Out-File -Append different file
}    
}

Я открыт для любых других предложений, кроме PowerShell. Большое спасибо за вашу помощь.

Ответы [ 2 ]

1 голос
/ 10 июля 2020

предполагая, что вам нужны все строки, начинающиеся с числа в диапазоне 18000..18999, это выполнит свою работу ... [ ухмылка ]

что он делает .. .

  • установить константы
  • создает файл для работы с когда будете готовы сделать это с вашими данными, замените весь блок #region/#endregion вызовом Get-Content.
  • загружает входной файл
  • выполняет итерацию через эту коллекцию
  • разбивает текущую строку, чтобы получить часть перед 1-м пробелом
  • преобразует это в [int]
  • проверяет, находится ли она в желаемом диапазоне
  • если ДА, отправляет его в файл 18
  • если НЕТ, отправляет его в файл not-18

этот код ...

  • отсутствует значительная обработка ошибок
  • не отслеживает, что было сделано
  • не показывает, что происходит

код ...

$SourceDir = "$env:TEMP\WBCha"
$TargetNumberRange = 18000..18999
$InFile = Join-Path -Path $SourceDir -ChildPath 'InFile.txt'
$18OutFile = Join-Path -Path $SourceDir -ChildPath '18_OutFile.txt'
$Not_18OutFile = Join-Path -Path $SourceDir -ChildPath 'Not_18OutFile.txt'

#region >>> create a file to work with
#    when ready to do this for real, replace the whole "region" block with a Get-Contnet call
if (-not (Test-Path -LiteralPath $SourceDir))
    {
    $Null = New-Item -Path $SourceDir -ItemType 'Directory' -ErrorAction 'SilentlyContinue'
    }
$HowManyLines = 1e1
$Content = foreach ($Line in 0..$HowManyLines)
    {
    $Prefix = @(18,19)[(Get-Random -InputObject @(0, 1))]
    '{0}{1:d3} - {2}' -f $Prefix, $Line, [datetime]::Now.ToString('yyyyy-MM-dd HH:mm:ss:ffff')
    }
$Content |
    Set-Content -LiteralPath $InFile -ErrorAction 'SilentlyContinue'
#endregion >>> create a file to work with


foreach ($IF_Item in (Get-Content -LiteralPath $InFile))
    {
    if ([int]$IF_Item.Split(' ')[0] -in $TargetNumberRange)
        {
        Add-Content -LiteralPath $18OutFile -Value $IF_Item
        }
        else
        {
        Add-Content -LiteralPath $Not_18OutFile -Value $IF_Item
        }
    }

18 содержимое файла ...

18000 - 02020-07-10 12:29:45:6736
18001 - 02020-07-10 12:29:45:6736
18004 - 02020-07-10 12:29:45:6746
18005 - 02020-07-10 12:29:45:6756
18006 - 02020-07-10 12:29:45:6756
18008 - 02020-07-10 12:29:45:6766
18010 - 02020-07-10 12:29:45:6766

not 18 содержимое файла ...

19002 - 02020-07-10 12:29:45:6746
19003 - 02020-07-10 12:29:45:6746
19007 - 02020-07-10 12:29:45:6756
19009 - 02020-07-10 12:29:45:6766
0 голосов
/ 10 июля 2020

Предполагая, что вы хотите разделить строки, начинающиеся с номеров, в один файл, а те, которые не начинаются с номеров, в другой файл, вы можете использовать оператор -match и передать Regex для сканирования всех строк в текстовом файле. и разделите те, которые начинаются с цифр.

Фрагмент кода выглядит примерно так:

$processText = $fileData.Split([Environment]::NewLine,[StringSplitOptions]::RemoveEmptyEntries)
{
     if($row -match "\d") #Regex to check whether the first character of $row is a digit
     {
         $row | Out-File -FilePath "D:\DataStartingWithNum.text"
     }
     else
     {
         $row | Out-File -FilePath "D:\DataStartingWithText.text"
     }
}

Если у вас есть и другие условия (которые вы могли пропустить в своем вопросе выше) ), вы можете использовать аналогичный способ отфильтровать любой шаблон исходных данных с помощью подходящего Regex с оператором -match.

Надеюсь, это поможет.

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