2015-03-11 3 views
0

У меня есть папка с 1 или более файлов, как это:Как разделить несколько больших текстовых файлов в несколько файлов с помощью PowerShell

bigfileA.txt 
bigfileB.txt 
bigfileC.txt 

Каждый файл содержит 1 линию и ограниченную ' Например, bigfileA.txt может содержат abcdef'ghijklmnop'qrst

Как я могу использовать powershell, чтобы при запуске файла .ps он автоматически разбивал все файлы в указанном каталоге на несколько файлов? Результат будет выглядеть так:

bigfileA1.txt --> abcdef 
bigfileA2.txt --> ghijklmnop 
bigfileA3.txt --> qrst 
bigfileB1.txt --> uvw 
bigfileB2.txt --> xyz 
bigfileC1.txt --> ... and so on... 
... and so on... 

Может кто-то помочь? Заранее спасибо!

ответ

1

Нижеприведенный сценарий будет проходить через выбранный вами каталог и создать текстовый файл с именем базового файла + текущий индекс (например, bigfileA + 1) и будет иметь значение с разделителем внутри.

$bigfiles = Get-ChildItem -Path 'C:\path\to\bigfiles\here' 

ForEach ($path in $bigfiles) 
{ 
    $contents = Get-Content $path.FullName 

    ForEach ($line in $contents) 
    { 
     $splitItems = $line.split("'") 

     For ($i = 0; $i -lt $splitItems.count; $i++) 
     { 
      New-Item -Path "$($path.Directory)\$($path.BaseName)$i.txt" -ItemType File -Value $splitItems[$i] 
     } 
    } 
} 

РЕДАКТИРОВАТЬ: вопрос с повторным чтением должен быть неверно истолкован в первый раз. Обновленный код.

Если вы хотите, чтобы файлы начинаются в 1 вместо 0 изменение этой линии

New-Item -Path "$($path.Directory)\$($path.BaseName)$i.txt" -ItemType File -Value $splitItems[$i] 

к этому

New-Item -Path "$($path.Directory)\$($path.BaseName)$($i+1).txt" -ItemType File -Value $splitItems[$i] 

Мы просто изменяя $i к $($i+1)

Функциональное Редактировать

не был проверен и был собран быстро, потому что я нахожусь на работе, но это по крайней мере, начало :)

function Split-BigFiles 
{ 
    [CmdletBinding(DefaultParameterSetName='All', 
        SupportsShouldProcess=$false, 
        PositionalBinding=$false)] 
    Param 
    (
     # Paths to bigfiles 
     [Parameter(Mandatory=$false, 
        ValueFromPipeline=$true, 
        ValueFromPipelineByPropertyName=$false, 
        ValueFromRemainingArguments=$false, 
        Position=0, 
        ParameterSetName='All')] 
     [ValidateScript({Test-Path $_ -PathType Container})] 
     [ValidateNotNullOrEmpty()] 
     [String[]] 
     $Path 
    ) 

    Begin 
    { 
     Write-Verbose "Starting Function Split-BigFiles" 
    } 
    Process 
    { 
     ForEach($folder in $Path) 
     { 
      Try 
      { 
       $bigfiles = Get-ChildItem -Path $folder -ErrorAction Stop 
      } 
      Catch 
      { 
       Write-Warning "Oh no i couldn't get the folder! This is the error i got $($_.Exception.Message)" 
      } 

      if ($bigfiles) 
      { 
       ForEach ($path in $bigfiles) 
       { 
        $contents = Get-Content $path.FullName 

        ForEach ($line in $contents) 
        { 
         $splitItems = $line.split("'") 

         For ($i = 0; $i -lt $splitItems.count; $i++) 
         { 
          New-Item -Path "$($path.Directory)\$($path.BaseName)$i.txt" -ItemType File -Value $splitItems[$i] 
         } 
        } 
       } 
      } 
     } 
    } 
    End 
    { 
     Write-Verbose "Exiting Function Split-BigFiles" 
    } 
} 
+0

Привет, спасибо за это. Еще один вопрос, как я могу преобразовать это в .ps1? (абсолютный начинающий начинающий здесь :) :) – Rafferty

+0

Два способа, скопируйте приведенный выше текст в блокнот и сохраните как '.ps1' или откройте« Powershell ISE », вставьте код и файл -> Сохранить. – Bluecakes

+0

Hi Bluecakes, извините, я не был ясен ... Как я могу параметризовать путь? Я попробовал шаблоны в Интернете о том, как создать функцию, но не удалось. – Rafferty

Смежные вопросы