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

How to rearange columns in txt files using powershell

您好,我正在尝试使用 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()

您可以将其缩短很多,但仍保持可读性:

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

当然,您可以在 1 行中将输出直接扔到文件中,但这为以后的进一步操作留下了空间。

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

正如评论中所建议的,在每个 运行 末尾您可以做的只是删除原始文件,然后将 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
}