您好我尝试使用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()
答案 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
当然,您可以将输出直接输入文件中,但是这样就可以打开门进行进一步操作了。