如何使用PowerShell重新排列txt文件中的列

时间:2017-07-13 18:26:49

标签: powershell streamwriter

您好我尝试使用powershell更改单个目录中多个文本文件的列顺序,我还需要在其中添加一个带有文件名的新列。 我想重写每个文件,而不是创建一个新文件。

例如: FILE1.TXT 原始文件内容:

column1;column2;column3

新文件内容 - FILE1.TXT

column2;column3;column1;File1

。 。 。 FileN.TXT

这是我到目前为止所做的:

谢谢

$reader = [System.IO.File]::OpenText('FILE1.txt')
$writer = New-Object System.IO.StreamWriter 'FILE1-NEW.txt'
for(;;) {
$line = $reader.ReadLine()
if ($null -eq $line) {
    break
}
$data = $line.Split(";")

$BaseName = $_.Basename
$writer.WriteLine('{0},{1},{2},$BaseName', $data[0], $data[2], $data[1])
}
$reader.Close()
$writer.Close()

2 个答案:

答案 0 :(得分:1)

您当前的方法很好,只要没有列值包含分隔符(;)。

正如评论中所建议的那样,在每次运行结束时你可以做的只是删除原始文件,然后将new / temporary重命名或移动到原始文件路径。

我个人使用Path.GetTempFileName()来分配临时文件:

# Gather all the files
$Files = Get-ChildItem .\path\to\files -Filter *.txt

foreach($txtFile in $Files){
    # Allocate new temp file
    $tempFilepath = [System.IO.Path]::GetTempFileName()

    # Open up original file for reading
    $reader = [System.IO.File]::OpenText($txtFile.FullName)

    # Open up temp file for writing
    $writer = New-Object System.IO.StreamWriter $tempFilepath
    for(;;) {
        $line = $reader.ReadLine()
        if ($null -eq $line) {
            break
        }
        $data = $line.Split(";")

        # Write data in modified order to temp file
        $writer.WriteLine('{0},{1},{2},{3}', $data[0], $data[2], $data[1], $txtFile.Basename)
    }
    $reader.Close()
    $writer.Close()

    # Move file into place, -Force will overwrite original
    Move-Item $tempFilepath -Destination $txtFile.FullName -Force
}

答案 1 :(得分:0)

你可以缩短它并保持它的可读性:

$output = Get-Content $FileName | % { write-output "$($_)$FileName;" }
$output >> $FileName

当然,您可以将输出直接输入文件中,但是这样就可以打开门进行进一步操作了。