按添加顺序导出数据-PowerShell Export-Csv

时间:2018-06-30 06:27:25

标签: powershell pscustomobject

我有这个代码

df['time'] = pd.to_datetime(df['time'], format='%Y-%m-%dT%H:%M:%S.%f000Z')
print (df)
                 time
0 2018-04-18 19:00:00
1 2018-04-18 19:15:00
2 2018-04-18 19:30:00

问题是,数据未按我将其添加到$ rec的顺序导出

如何按添加顺序将其导出?

2 个答案:

答案 0 :(得分:3)

即使不使用函数,简单的

active=False

将产生期望的结果。

您的功能过于复杂:

$mydata = $data | select Name,Grade,Score

在这里返回相同的顺序:

$Data = @"
Name,Grade,Score,Dummy
Anthoni,A,10,v
Brandon,B,20,x
Christian,C,30,y
David,D,40,z
"@ | ConvertFrom-Csv

function get-data() {
   ForEach($record in $data) {
       [PSCustomObject]@{
           Name =$record.name
           Grade=$record.grade
           Score=$record.score
       }
   }
}

$mydata=get-data
$mydata # | Export-Csv -Path $outputPath -NoTypeInformation

答案 1 :(得分:2)

LotPings' helpful answer提供了有效的解决方案。

关于您尝试过的事情

通过仅构造单个 [pscustomobject]实例循环外的

$DLGP = "" | Select "Name","Grade","Score"

,然后在每次循环迭代中仅更新该实例的属性:

$DLGP.Name=$record.name
# ....

有效地多次将相同的[pscustomobject]实例添加到结果数组,而不是在每次迭代中创建一个不同的对象。

由于同一对象被重复更新,因此该对象最终具有输入集合$data last 对象的属性。

顺便说一句:

[PSCustomObject] @()@()实际上是相同的:[PSCustomObject]忽略,并且您得到一个[object[]]数组。

要将数组键入为包含[PSCustomObject]实例的数组,您必须使用 array 类型的强制转换:[PSCustomObject[]] @()

但是,鉴于可以将 any 类型的实例强制转换为[PSCustomObject]-与[psobject]确实相同-这不会提供类型安全性,也不会提供性能优势。

此外,由于您的$rec变量不受类型限制(它被定义为$rec = [<type>] ...而不是[<type>] $rec = ...),并且您正在使用+=来“添加” “”数组(总是需要在幕后创建一个新实例),$rec将在第一个[object[]]操作之后恢复为+=数组。