如何使用Powershell从多个csv文件中提取一个特定列(无标题,比如第2列)?

时间:2015-02-28 01:21:01

标签: powershell csv

我有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

2 个答案:

答案 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