【发布时间】:2016-01-15 19:00:58
【问题描述】:
使用下面的代码,我可以在 5 秒内合并多个 .csv 文件。
$getFirstLine = $true
get-childItem "C:\my\dir\*.csv" | foreach {
$filePath = $_
$lines = $lines = Get-Content $filePath
$linesToWrite = switch($getFirstLine) {
$true {$lines}
$false {$lines | Select -Skip 1}
}
$getFirstLine = $false
Add-Content "C:\my\dir\output_code2.csv" $linesToWrite
}
我想更进一步,最好使用管道删除几个列,使用如下命令:
select DateAndTime,DG1_KW,DG2_KW,WT_KW,HTR1_KW,POSS_Load_KW,INV1_KW,INV2_SOC|Export-csv output_test.csv -Notypeinformation
这是每个文件头中的变量。
我将如何修改此代码以使其正常工作?这里的想法是我将处理成百上千个文件。
我有其他代码可以做到这一点,但速度远没有那么快。
例如使用 10 个 .csv 文件,每个文件大小为 450kb。下面的代码需要 20 秒来处理并在 20 秒内吐出一个 .csv 文件,删除 56 列中的 48 列,留下我需要的变量。如果我删除修剪列的部分代码,它仍然需要 12 秒以上。
# Directory containing csv files, include *.*
$directory = "C:\my\dir\*.*";
# Get the csv files
$csvFiles = Get-ChildItem -Path $directory -Filter *.csv;
#$content = $null;
$content = @();
# Process each file
foreach($csv in $csvFiles)
{
$content += Import-Csv $csv;
}
# Write a datetime stamped csv file
$datetime = Get-Date -Format "yyyyMMddhhmmss";
$content |Export-Csv -Path "C:\my\dir\output_code2_$datetime.csv" -NoTypeInformation;
我要修改的代码在 5 秒内运行相同的 10 个文件,但不会删除 48 列。
有什么想法吗?
【问题讨论】:
-
您的快速代码运行速度如此之快,因为它不会将文件视为 CSV,它只是将其视为文本并且不必为每条记录创建对象,它只是一个字符串数组。如果您的文件都具有相同的列,您可以使用正则表达式替换来删除额外的列,但它们都必须以相同的方式格式化。
-
@TheMadTechnician 你能举例说明这段代码的样子吗?
标签: powershell csv merge