Как удалить строки на основе даты из файлов с помощью PowerShell - PullRequest
0 голосов
/ 06 марта 2012

У меня есть несколько файлов CSV, в которых мне нужно удалить все строки, содержащие дату, превышающую указанную дату.Как мне сделать это в PowerShell?

Кстати: вот формат даты: 09/29/2011

Пример: я хотел бы удалить все строки, содержащие дату больше 09 /29 / 2011.

Ответы [ 5 ]

2 голосов
/ 06 марта 2012
 foreach ($file in gci *.csv){
   (gc $file) |
     ? {[datetime]$_.split('|')[1] -lt '09/29/2011'
     } | set-content $file

 }

Предполагается, что это файл с разделителем каналов.

1 голос
/ 06 марта 2012

Хорошо, похоже, в этой строке есть только одна вещь, которая выглядит как дата, так что мы можем просто отфильтровать это:

Get-ChildItem *.csv | # adapt if necessary
  ForEach-Object {
    (Get-Content $_) | # the parentheses are important so the entire file is read at once
      Where-Object { # now we process the file line by line
        # find the date                       ↓ suppress the boolean output
        $_ -match '\|(\d{2}/\d{2}/\d{4})\|' | Out-Null

        # this only works if every line contains a date. Hopefully it does.
        $date = [DateTime]($Matches[1])

        # Finally the comparison we wanted in the first place
        # This is the condition for all lines that are *retained* (hence less than)
        $date -lt '09/29/2011'
      } | Out-File $_ # use -Encoding ASCII/UTF8/Unicode depending on your needs.
                      # Maybe ASCII is enough
  }

или короче:

gci *.csv | % {
  (gc $_) |
    ? {
      $null = $_ -match '\|(\d{2}/\d{2}/\d{4})\|'
      [DateTime]$Matches[1] -lt '09/29/2011'
    } |
    Out-File $_
}
1 голос
/ 06 марта 2012

Я предпочел ясность, а не лаконичность:

param (
    [parameter(Mandatory = $true)] [string] $csvFileName,
    [parameter(Mandatory = $true)] [datetime] $date
)

try
{
    $Error.Clear()

    if (!(Test-Path $csvFileName))
        { throw "Could not find file $csvFileName" }

    $newContent = Get-Content $csvFileName |    ?{
        ([regex]::matches($_, "[0-9]{2}/[0-9]{2}/[0-9]{4}") | %{[DateTime] $_.value -lt $date})
    } 

    $newContent | Set-Content $csvFileName
}

catch
{
    Write-Host "$($MyInvocation.InvocationName): $_"
}
0 голосов
/ 06 марта 2012

Я написал для вас скрипт, который удаляет каждую строку с указанным вами шаблоном. Вы должны запустить скрипт, такой как:

myscruipt.sh YOURDATYE YOURCSVFILE

myscript.sh:

#!/bin/bash
    declare -a  num
    num=`egrep -n "$1" yahoo_ab.csv |awk 'BEGIN{FS=":";}{for (i=0 ; i<NF ; i++) print $1; } '`
    while true; do 
        for i in $num ; do 
            sed -i "$i d" $2 ;
        done;
        egrep $1 $2;
        if [ $? = 1 ]; then break; fi;
    done;
0 голосов
/ 06 марта 2012

Вам нужно создать новый очищенный CSV-файл:

. Предположим, что это вы CSV:

col1,date,col3
aaaaa,05/05/2010,rwer
bdfdfg,06/29/2011,reewr
dsfsdf,08/05/2012,dsfsd

сделайте так:

import-csv .\myoriginal.csv -delimiter '|' | ? { [datetime]$_.date -ge [datetime]"09/29/2011"} | Export-Csv -NoTypeInformation -Path .\mycleaned.csv -delimiter '|'

, тогда вы можетеудалить оригинальный CSV с

remove-item .\myoriginal.csv
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...