如何使用PowerShell将多个大文本文件拆分为多个文件

时间:2015-03-11 02:02:01

标签: file powershell split delimiter

我有一个包含1个或更多文件的文件夹,如下所示:

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 个答案:

答案 0 :(得分: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"
    }
}