我有以下代码:
function realtest
{
$files = Get-ChildItem -Path 'D:\data\' -Filter *.csv
$tester = [PSCustomObject]@{
foreach ($file in $files)
{
$tempName = $file.BaseName
$temp = Import-Csv $file
$tester | Add-Member -MemberType NoteProperty -Name $tempName -Value $temp.$tempName
}
$tester
$tester | Export-Csv "D:\result.csv" -NoTypeInformation
}
我正在尝试将一堆数据导出到CSV,但是当它在csv上显示数据时,如下所示
"E0798T102","E0798T103"
"System.Object[]","System.Object[]"
但是当我在控制台上打印时,它显示如下
E0798T102 E0798T103
--------- ---------
{0, 0, 0, 0...} {0, 0, 0, 0...}
最终,我希望E0798T102和E0798T103作为result.csv中的单独列
请注意,我将循环播放50个csv,并且每个csv都应显示为自己的列
答案 0 :(得分:0)
根据您的代码段,这可以大大简化:
function Get-Csv {
$col = foreach ($file in Get-ChildItem -Path D:\data -Filter *.csv) {
$csv = Import-Csv -Path $file.FullName
[pscustomobject]@{
$csv.($file.BaseName) = $csv
}
}
$col | Export-Csv D:\result.csv -NoTypeInformation
return $col
}
然而,csv文件似乎是错误的方法,因为您试图将 objects 嵌入标头下。这实际上不能以表格格式工作,因为您只能得到一层深度。您应该扩展对象上的所有属性,或者使用其他可以表示深度的格式,例如json。
格式化失败的原因是由于序列化的工作方式。您将获得对象的字符串表示形式。
转换为json并不困难,您只需交易Export-Csv
通话:
$col | ConvertTo-Json -Depth 100 | Out-File -FilePath D:\result.json
注意:我指定-Depth 100
是因为cmdlet的默认Depth
是2
。
答案 1 :(得分:0)
对于您的问题,这是一个效率极低的答案。如果保持原样,则假定您的CSV文件已经具有标有CSV文件基本名称的标头:
$CSVs = Get-ChildItem -path 'D:\data\' -filter "*.csv" -file
$headers = $CSVs.basename
$table = [System.Data.DataTable]::new("Files")
foreach ($header in $headers) {
$table.Columns.Add($header) | out-null
}
foreach ($CSV in $CSVs) {
#$contents = Import-Csv $CSV -Header $CSV.basename # If CSV has no header
$contents = Import-Csv $CSV # If CSV contains header
$rowNumber = 0
foreach ($line in $Contents) {
$rowcount = $table.rows.count
if ($rowNumber -ge $rowCount) {
$row = $table.NewRow()
$row[$CSV.basename] = $line.$($CSV.basename)
$table.Rows.Add($row)
}
else {
$row = $table.rows[$rowNumber]
$row[$CSV.basename] = $line.$($CSV.basename)
}
$rowNumber++
}
}
$table | Export-Csv output.csv -NoTypeInformation
如果CSV文件没有标题,则可以取消注释带注释的$contents
行。如果您取消注释第一个变量,则只需注释掉下一个$contents
变量。