Powershell .csv与列删除合并

时间:2015-10-16 22:20:06

标签: powershell csv merge

使用下面的代码,我可以在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列。

任何想法的人?

1 个答案:

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