使用下面的代码,我可以在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
作为每个文件标题中的变量。
如何修改此代码才能使其正常工作?这里的想法是我将要处理数百个文件。
我有其他代码可以做到这一点,但它没有接近那么快。
例如使用每个450kb的10个.csv文件。下面的代码需要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列。
任何想法的人?
答案 0 :(得分:0)
好的,你想要一个例子......假设你的CSV总是这样:
mvn release:prepare -Darguments="-DjavadocExecutable=/usr/lib/jvm/java-8-oracle/bin/javadoc"
现在假设你只想要Col1,Col2,Col6,Col9和Col10。您可以使用RegEx替换类似的内容:
Col1,Col2,Col3,Col4,Col5,Col6,Col7,Col8,Col9,Col10
data1,data2,data3,data4,data5,data6,data7,data8,data9,data10
dataA,dataB,dataC,dataD,dataE,dataF,dataG,dataH,dataI,dataJ
这将只提取我上面提到的列。有关RegEx字符串的详细信息,请参阅https://regex101.com/r/jY4oO6/1。有效输出将是(如果这样决定,则跳过第一行):
$Files = get-childItem "C:\my\dir\*.csv" | Select -Expand FullName
ForEach($File in $Files){
If($SkipFirst){
Get-Content $File | Select -Skip 1 | ForEach{$_ -replace "^((?:.*?\,){2})(?:.*\,){3}(.*?\,)(?:(?:.*?\,){2})(.*?,.*?)$", '$1$2$3'} | Add-Content "C:\my\dir\output_code2.csv"
}Else{
Get-Content $File | ForEach{$_ -replace "^((?:.*?\,){2})(?:.*\,){3}(.*?\,)(?:(?:.*?\,){2})(.*?,.*?)$", '$1$2$3'} | Add-Content "C:\my\dir\output_code2.csv"
}
}