【问题标题】:How to split multiple big text files into multiple files using powershell如何使用powershell将多个大文本文件拆分为多个文件
【发布时间】:2015-03-11 02:02:01
【问题描述】:

我有一个包含 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...

有人可以帮忙吗?提前谢谢!

【问题讨论】:

    标签: file powershell split delimiter


    【解决方案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"
        }
    }
    

    【讨论】:

    • 嗨,谢谢。还有 1 个问题,如何将其转换为 .ps1? (这里绝对是powershell初学者:))
    • 两种方法,将上面的文字复制到记事本并保存为.ps1或打开Powershell ISE,粘贴代码和文件->保存。
    • 嗨,Bluecakes,对不起,我不清楚...如何参数化路径?我在网上尝试了如何创建函数的模板,但失败了。
    • 添加了一个编辑以包含一个示例函数,尚未经过测试,但应该提供将其变为带参数的函数的基础知识。可以使用Split-BigFiles -Path C:\bigfilesfolder1,C:\bigfilesfolder2调用
    • 谢谢!我将代码放在 Split-Bigfiles.ps1 中。然后运行 ​​.\Split-Bigfiles -path D:\Temp。但是由于某种原因,当我运行它时没有任何反应。它甚至不输出 Begin{} write-verbose。我做错了吗?