使用Powershell创建Csv

时间:2015-07-06 19:33:07

标签: csv powershell

我正在尝试使用以下文件名:John_Doe_E_DOB_1 / 1 / 46_M(这是性别)_ID_0000000_IMG_FileName_Date-of-File_1 / 1 / 15_Doc-page-1并创建一个CSV文件以在Excel中打开,并带有列标题:姓氏,名字,MI,ID号,文件名,文件日期以及文档类型。到目前为止,这是我的代码:

Get-ChildItem -Path C:\Users\name\desktop\test -Recurse | ForEach-Object {$_ | add-member -name "Owner" -membertype noteproperty -value (get-acl $_.fullname).owner -passthru} | Sort-Object fullname | Select BaseName,Name,Owner | Export-Csv -Force -NoTypeInformation C:\Users\name\desktop\test\thing.csv

所有这一切都是在顶部删除那么长的文件名,然后在另一列的末尾添加ext。例如:

John_Doe_E_DOB_1 / 1 / 46_M(这是性别)_ID_0000000_IMG_FileName_Date-of-File_1 / 1 / 15_Doc-page-1将在第1列和

John_Doe_E_DOB_1 / 1 / 46_M(这是性别)_ID_0000000_IMG_FileName_Date-of-File_1 / 1 / 15_Doc-page-1.txt< -----将是第2列的唯一区别

如何将超过一百万个文件,不同长度和大小分开,并将其分解为上面列出的类别?非常感谢所有的帮助。

1 个答案:

答案 0 :(得分:1)

我会通过调用过滤函数来替换管道的Select阶段:

filter GenObj {
    $parts = $_.FullName.Split('_')
    new-object pscustomobject -property @{ 
             Owner = (get-acl $_.fullname).owner 
             FirstName = $parts[0]
             LastName = $parts[1]
             MiddleInitial = $parts[2]
             # Fill in the rest
    }
}

Get-ChildItem -Path C:\Users\name\desktop\test -Recurse | 
    Sort-Object fullname | 
    GenObj | 
    Export-Csv -Force -NoTypeInformation C:\Users\name\desktop\test\thing.csv

这将创建一个新的自定义对象,其中包含与要提取的文件名部分对应的所有属性。

此字符串拆分方法可能不起作用,具体取决于您如何处理没有中间首字母的名称。

另请注意,如果您正在处理一百万个文件,使用Sort-Object将导致每个FileInfo对象(每个文件一个)在内存中缓冲,以便可以执行排序。您可能会耗尽内存,命令将失败。我会考虑在这种情况下删除Sort-Object。