【问题标题】:Loop through multiple Tab delimited Text files and split them in to smaller files循环遍历多个制表符分隔的文本文件并将它们拆分为较小的文件
【发布时间】:2018-08-16 21:25:05
【问题描述】:

我有以下脚本(大部分是在此处找到的),它非常适合使用第三个“列”中的值来拆分单个制表符分隔的文本文件。我需要它一次处理多个文本文件。可以是 2 也可以是 10。

我尝试添加一个foreach 语句,但它仍然只处理其中的一个文件,即使变量$source 保存了源文件夹中所有文件的值。请注意,使用注释掉的 $source 行,我试图创建一个包含完整路径和文件名的数组。使用时会报错。

代码如下:

#$source = Get-ChildItem \\srvfile1oke\meas\OEG\Shared\Text_File_Splitter\* -Include *.txt | %{ @{Path=$_.fullname} }
#$target = "\\srvfile1oke\meas\OEG\Shared\Text_File_Splitter\"
$source = Get-ChildItem "\\srvfile1oke\meas\OEG\Shared\Text_File_Splitter\*.txt"
$target = "\\srvfile1oke\meas\OEG\Projects\FlowCal service files\Flow Text Files\MeterTextFilesByImportID\"
$fileIn = New-Object -TypeName System.IO.StreamReader -ArgumentList $source
$header = $fileIn.ReadLine()
$currentFile = ""

foreach ($file in $source) {
    while ($line = $fileIn.ReadLine()) {
        $newFile = "$(($line -split "\t")[2]).txt"
        if ($newFile -ne $currentFile) {
            #starting on a new file
            if ($currentFile -ne "") {
                # Write out contents of current file
                $fileOut.ToString() | Out-File -FilePath $target\$currentFile -Encoding ascii
            }
            # Get ready for a new current file
            $currentFile = $newFile
            $fileOut = New-Object -TypeName System.Text.StringBuilder
            [void]$fileOut.Append($header)
        }
        Write-Verbose "$currentFile, $line"
        [void]$fileOut.Append("`r`n$($line)")
    }
    # Write out contents of last file
    $fileOut.ToString() | Out-File -FilePath $target\$currentFile -Encoding ascii
}

【问题讨论】:

    标签: powershell foreach csv


    【解决方案1】:

    您需要为循环内的每个单独文件创建一个StreamReader

    $fileIn = New-Object -TypeName System.IO.StreamReader -ArgumentList $source
    $header = $fileIn.ReadLine()
    $currentFile = ""
    
    foreach ($file in $source) {
        $fileIn = New-Object IO.StreamReader $file
        $header = $fileIn.ReadLine()
        while ($line = $fileIn.ReadLine()) {
        ...
    }

    【讨论】:

    • 太棒了!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 2014-12-15
    • 2011-09-27
    相关资源
    最近更新 更多