use*_*224 2 csv powershell select-object export-csv
我有很多时间试图理解为什么这个脚本没有按预期工作。这是一个简单的脚本,我试图在其中导入 CSV,选择我想要的几列,然后导出 CSV 并复制自身。(基本上我们已经归档了数据,由于内存大小限制,我只需要从另一个项目中提取几列数据)。这个脚本非常简单,它显然与它不起作用时造成的挫败感成反比关系......现在最终结果是我最终得到一个空的 csv 而不是一个只包含我选择的列的 csv与选择对象。
$RootPath = "D:\SomeFolder"
$csvFilePaths = Get-ChildItem $RootPath -Recurse -Include *.csv |
ForEach-Object{
Import-CSV $_ |
Select-Object Test_Name, Test_DataName, Device_Model, Device_FW, Data_Avg_ms, Data_StdDev |
Export-Csv $_.FullName -NoType -Force
}
Run Code Online (Sandbox Code Playgroud)
除非您预先完整地将输入文件读入内存,否则您无法安全地读取和写入给定管道中的同一个文件。
具体而言,一个命令,例如Import-Csv file.csv | ... | Export-Csv file.csv将擦除的内容file.csv。
最简单的解决方案是将读取输入文件的命令包含在 中(...),但请注意:
该文件的内容(转换成对象)必须装入内存作为一个整体。
如果管道在所有(转换后的)对象写回文件之前中断,则存在轻微的数据丢失风险。
应用于您的命令:
$RootPath = "D:\SomeFolder"
Get-ChildItem $RootPath -Recurse -Include *.csv -OutVariable csvFiles |
ForEach-Object{
(Import-CSV $_.FullName) | # NOTE THE (...)
Select-Object Test_Name, Test_DataName, Device_Model, Device_FW,
Data_Avg_ms, Data_StdDev |
Export-Csv $_.FullName -NoType -Force
}
Run Code Online (Sandbox Code Playgroud)
请注意,我已经使用-OutVariable csvFiles它来收集输出变量中的 CSV 文件信息对象$csvFiles。您尝试通过收集文件路径$csvFilePaths = ...不起作用,因为它尝试收集Export-Csv的输出,但不Export-Csv产生任何输出。
此外,为了安全起见,我已将Import-Csv参数从$_to更改$_.FullName为确保Import-Csv找到输入文件(因为,遗憾的是, file-info 对象$_绑定为string,有时会扩展为单纯的 file name)。
一个更安全的解决方案将是输出到一个临时文件中的第一,和(只)在成功完成替换原文件。
无论采用哪种方法,替换文件都将具有默认文件属性和权限;如果原始文件具有要保留的特殊属性和/或权限,则必须明确地重新创建它们。
| 归档时间: |
|
| 查看次数: |
1082 次 |
| 最近记录: |