我有23个csv文件。每个文件包含两列。我只希望第二列是输出(输出可以是csv或xlsx文件;文件名= Banks_2008_2014.some扩展名)。我想获取第一个文件的第二列,并将其放入输出文件的第一列。
$excel_test = New-Object -ComObject Excel.Application
$excel_test.visible =$true
$excel_test.DisplayAlerts =$true
$excel_test|select-object |format-table -autosize
$excelFiles = Get-ChildItem -Path C:\SNOWPACK\Samarth\1_Banks\AllPro_Banks_Point1 -Include *.csv -Recurse
Freach ($i in $excelFiles)
{
$excel_test.workbook.worksheet.column.item($i) = $i[1]
}
错误:无法索引到(System.IO).File.Info
示例:
File_1
Column_1 Column_2
0.1 0.11
0.2 0.45
0.35 0.6
0.25 0.8
0.33 0.1
File_2
Column_1 Column_2
0.9 0.2
0.2 0.11
0.45 0.4
0.34 0.6
结果应如下所示
Column_1 Column_2
0.11 0.2
0.45 0.11
0.6 0.4
0.8 0.6
0.1
答案 0 :(得分:2)
如果您没有标题,只需进行一些操作:
Import-Csv C:\SNOWPACK\Samarth\1_Banks\AllPro_Banks_Point1\*.csv -Header (1..10) |
Select -ExpandProperty '2' |
set-content C:\SNOWPACK\Samarth\1_Banks\AllPro_Banks_Point1\Banks_2008_2014.csv
答案 1 :(得分:0)
所以你只得到csv文件集合中的第二列?
$path = "C:\SNOWPACK\Samarth\1_Banks\AllPro_Banks_Point1\*.csv"
Get-Content $path | ForEach-Object{$_.Split(",")[1]} | set-content C:\SNOWPACK\Samarth\1_Banks\AllPro_Banks_Point1\Banks_2008_2014.csv
这将从csv文件集合中的每一行中提取第二个项目。这当然是假设你的csv文件形成得很好。引号内没有逗号。
猜测您的错误来自(get-content $File.)
,因为解析器会看到您尝试访问其中未指定任何内容的$file
。
从问题更新
看起来你原来的问题并不清楚。将列添加到一起是一个不同的球类游戏,但它可以完成。
$inputPath = "C:\SNOWPACK\Samarth\1_Banks\AllPro_Banks_Point1"
# Create a multidimensional array of all the files.
$allFiles = @()
Get-ChildItem -Path $inputPath -Include "*.csv" -Recurse | ForEach-Object{$allFiles += ,@($_ | Get-Content | ForEach-Object{$_.Split(",")[1]})}
Write-Host "Collected $($allFiles.Count) files" -ForegroundColor Green
# Determine the length of the longest row
$maxRows = $allFiles | ForEach-Object{$_.Count} | Measure-Object -Maximum | Select-Object -ExpandProperty Maximum
Write-Host "Highest Row Count: $maxRows" -ForegroundColor Green
# Next line will clear the file. Uncomment it if that is what you are looking for.
#Clear-Content c:\temp\newfile.csv
For($rowIndex = 0; $rowIndex -lt $maxRows; $rowIndex++ ){
# Build each row individually
$row = @()
For($fileIndex = 0; $fileIndex -lt $allFiles.Count; $fileIndex++ ){
# Build an array of all the elements from each file in this row
$row += $allFiles[$fileIndex][$rowIndex]
}
# Create proper delimeted row using -join and ouput to file.
$row -join "," | Add-Content c:\temp\newfile.csv
}
如果文件的长度可变,并且某些行包含空条目,这也应该有用。
编辑2.0
修正了输出的工作原理。这可能不是最有效的方法,但如果你的文件很小,它就可以正常工作。每行调用Add-Content
。注意注释掉的Clear-Content
。