如何在制表符分隔文件中替换列标题?

时间:2017-10-16 13:09:43

标签: powershell csv

我有一个制表符分隔的txt文件,我需要切换第一列和第二列名称(不切换列数据)。换句话说,我需要将A(Id)重命名为B(ExternalId),将B(ExternalId)重命名为A(Id)。文件中的其他列(其他数据)应保持不变。我是PowerShell的新手,请指教。据我所知,我需要使用import / export csv cmdlet。

我试过这个,但是它的工作方式不正确......

Import-Csv 'C:\original_users.txt' | 
    Select-Object Id, @{Name="ExternalId";Expression={$_."Id"}}; Select-Object ExternalId, @{Name="Id";Expression={$_."ExternalId"}} | 
    Export-Csv 'C:\changed_users.txt' 

1 个答案:

答案 0 :(得分:0)

Import-CSVExport-CSV cmdlet有其优势,但这可能不是其中之一。后一个cmdlet会引入可能不在原始文件中且可能不需要的引用。

无论哪种方式,为什么不在第一行做一些文本操作!让我们读入文件,然后输出第一个内衬,编辑和文件的其余部分。此示例使用新位置,但您可以轻松地将其写回同一文件。

# Get the full file into a variable
$fullFile = Get-Content "c:\temp\mockdata.csv"

# Parse the first line into a column array
$columns = $fullFile[0].Split("`t")

# Rebuild the header by switching the columns order as desired. 
$newHeader = ($columns[1],$columns[0] + ($columns | Select-Object -Skip 2)) -join "`t"

# Write the header back to file then the rest of the data.
$outputPath = "C:\somepath.txt"

$newHeader | Set-Content $outputPath
$fullFile | Select-Object -Skip 1 | Add-Content $outputPath

这也保留了其他列及其数据的存在。