从文件夹中的30个不同文件中仅提取Powershell中csv文件的前10行

时间:2019-02-04 20:33:15

标签: powershell csv

我在一个文件夹(文件夹A)中有300多个.csv文件,其中分别包含计算机信息(计算机名称,HD大小,内存等)。标头是项目和值。

我需要从文件夹中每个文件中提取前25行,并将其放入一个csv文件中。

Get-Content "C:\folder\A\*.csv" | select -First 25 | Out-file "C:\folder\B\.csv" 

这正常工作,但是如何使它用于文件夹A中的所有文件?

2 个答案:

答案 0 :(得分:0)

# The single output file.
$outFile = 'C:\folder\B.csv'

# Get all input CSV files as an array of file-info objects.
$inFiles = @(Get-ChildItem C:\folder -Filter A*.csv)

# How many *data* rows to extract from each input CSV
$count = 25

# Extract the header line (column names) from the first input file
# and write it to the output file.
Get-Content $inFiles[0] -First 1 | Set-Content -Encoding Utf8 $outFile

# Process all input files and append their first 25 *data* rows to the
# output file.
foreach ($file in $inFiles) {
  Get-Content $_.FullName -First ($count+1) | Select-Object -Skip 1 | 
    Set-Content -Append -Encoding Utf8 $outFile 
}

请注意使用-Encoding Utf8作为示例;根据需要进行调整;默认情况下,Set-Content将在Windows PowerShell中使用“ ANSI”编码,而在PowerShell Core 中使用无BOM的UTF-8。

注意事项:通过逐行纯文本处理,您依赖于表示单个CSV 数据行的每条文本行 ;这通常是 ,但这不是必须的。

另一种方法是使用Import-CsvExport-Csv处理文件,但是(a)会产生大量的处理开销,并且(b)始终对所有列值都加双引号,即使它们不是'最初是t(尽管通常不重要)。

也就是说,无论何时需要读取和解释数据(而不是仅将其复制到其他地方),Import-CsvExport-Csv无疑是更好的选择。

相反,如果性能至关重要,则可以直接使用。[IO.File]::ReadLines()之类的.NET方法,或者如果文件足够小,甚至[IO.File]::ReadAllLines()也可以大大提高上述纯文本方法的速度。


关于您尝试过的事情

  

Get-Content "C:\folder\A*.csv" | select -First 25

这不会从每个文件中提取25行,而是从与所有通配符表达式(A*.csv)相匹配的 all 文件中收集行,然后提取从一开始的单个 25个元素切片。

另外,为了输出到单个 CSV输出文件:

  • 您必须确保仅将一个标头行(带有列名的行)写入输出文件。

  • 然后必须从每个文件中在该标题行之后加上25个 data 行,即编号从 2到26 的行。

    < / li>

答案 1 :(得分:0)

如果您的30/300? CSV文件包含10/25?名称,值对,
将它们组合到单个csv文件中没什么用;
除非它们是统一且独特的,并且因此可以
被视为哈希表,并转换为[PSCustomObject]

的输入

因此,只要您输入的csv如下:

|PCone.csv           |PCtwo.csv           |PChree.csv          |
+--------------------+--------------------+--------------------+
|item,value          |item,value          |item,value          |
|machine name,PCone  |machine name,PCtwo  |machine name,PCthree|
|HD size,250GB       |HD size,1TB         |HD size,1TB         |
|memory,8192         |memory,16384        |memory,16384        |

此脚本:

## Q:\Test\2019\02\05\SO_54523916.ps1
$Columns = @("machine name","HD size","memory")

$AllCsv = foreach($csv in Get-ChildItem pc*.csv){
    [pscustomobject](ConvertFrom-StringData -StringData (
                     (Get-Content $Csv -raw) -replace ',', "="))
}

$AllCsv | Select-Object $Columns

产生以下输出:

machine name HD size memory
------------ ------- ------
PCone        250GB   8192
PCthree      1TB     16384
PCtwo        1TB     16384