我正在尝试将一列添加为现有csv中的第二列,现有文件具有2列。
我尝试了以下代码,但是当我运行它时,它只会生成一个没有内容的零字节文件。如果我将输出定向到另一个文件名,则它将按预期工作。
$inFile = "C:\temp\Book1.csv"
Import-Csv $inFile | Select Provider,@{N='SelectionName';E={''}},MarketType | Export-Csv $inFile -NoTypeInformation
我想要的输出如下。即包括新列的标题,但不添加数据
Provider,SelectionName,MarketType
ABC,首页
答案 0 :(得分:0)
在要写入相同文件的管道中,必须确保在 开始写入之前完成文件的读取。
如果您有话要说
Import-Csv 'a.csv' | Export-Csv 'a.csv'
这两个操作同时打开文件,但是Export-Csv
也将其截断(因为它将被写入文件,替换现有数据)。当Import-Csv
开始读取已被截断的文件时,没有剩余数据可读取,因此没有数据通过管道传递,因此没有任何内容写回到文件中。因此,您将得到一个空文件。
为避免此行为,请将read语句放在括号(即子表达式)中:
(Import-Csv 'a.csv') | Export-Csv 'a.csv'
这可确保首先读取文件,并在读取完成后将其写入。
这种方法的缺点是所有数据都被读入内存,这在处理大文件时会影响系统性能。该方案的解决方法是先将输出写入临时文件,然后将其替换为临时文件:
Import-Csv 'a.csv' | Export-Csv 'temp.csv'
Remove-Item 'a.csv'
Move-Item 'temp.csv' 'a.csv'
请注意,这不限于Import-Csv
/ Export-Csv
。它适用于您正在写入要读取的相同文件的所有操作。