向CSV中添加列会导致空白文件

时间:2019-07-18 15:02:40

标签: powershell

我正在尝试将一列添加为现有csv中的第二列,现有文件具有2列。

我尝试了以下代码,但是当我运行它时,它只会生成一个没有内容的零字节文件。如果我将输出定向到另一个文件名,则它将按预期工作。

$inFile = "C:\temp\Book1.csv"

Import-Csv $inFile | Select Provider,@{N='SelectionName';E={''}},MarketType | Export-Csv $inFile -NoTypeInformation

我想要的输出如下。即包括新列的标题,但不添加数据

Provider,SelectionName,MarketType

ABC,首页

1 个答案:

答案 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。它适用于您正在写入要读取的相同文件的所有操作。