如何使用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
}
您好,我正在尝试使用 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
}