我在一个文件夹(文件夹A)中有300多个.csv文件,其中分别包含计算机信息(计算机名称,HD大小,内存等)。标头是项目和值。
我需要从文件夹中每个文件中提取前25行,并将其放入一个csv文件中。
Get-Content "C:\folder\A\*.csv" | select -First 25 | Out-file "C:\folder\B\.csv"
这正常工作,但是如何使它用于文件夹A中的所有文件?
答案 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-Csv
和Export-Csv
处理文件,但是(a)会产生大量的处理开销,并且(b)始终对所有列值都加双引号,即使它们不是'最初是t(尽管通常不重要)。
也就是说,无论何时需要读取和解释数据(而不是仅将其复制到其他地方),Import-Csv
和Export-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