2015-06-26 2 views
0

У меня есть входной файл CSV со значениями аналогично ниже:Получить конкретное значение из неоднозначного массива значений Powershell/Excel VBA

EmpID LastDay FeedDate 
A123 20150428 2015-04-20 
A123 20150428 2015-04-21 
A123 20150428 2015-04-21 
A444 20150625 2015-06-15 
A444 20150625 2015-06-15 
A444 20150625 2015-06-16 
A444 20150628 2015-06-18 
A444 20150628 2015-06-19 
F999 20150410 2015-04-02 
X666 20150122 2015-01-10 
X666 20150122 2015-01-10 
X666 20150122 2015-01-10 
X666 20150122 2015-01-10 
X666 NULL  2015-01-10 
X666 20150120 2015-01-10 
X666 20150120 2015-01-10 

Здесь количество записей каждого EmpID имеет не фиксируется, LastDay может/не изменяться, FeedDate может/не быть последовательным.

Здесь я должен найти наиболее старый FeedDate с Последним LDIO Для например, для EmpId А123 должно быть:

A123 20150428 2015-04-20 (поскольку LastDay не изменилась)

Для A444 должно быть A444 20150628 2015-06-18 Для X666 она должна быть X666 20150120 2015-01-10

Input уже отсортирован: EmpID (от А до Z) & затем поток Дата (от старых к новым)

Я уна чтобы построить логику, в которой он будет зацикливаться (возможно, Do-While) для каждого уникального EmpID, поскольку он не исправлен?

Может ли кто-нибудь помочь мне понять логику того, как я могу достичь этого в powershell или Excel VBA?

+0

Anyone? Пожалуйста ... –

+0

Довольно пожалуйста ... :) –

+0

все еще застрял на этой логике ...? –

ответ

0

Это звучит для меня, как вы бы сделать следующее с вашими данными:

Для каждого уникального EmpId:

  1. Найти последнюю LastDay.
  2. Для этого последнего LastDay найдите самую раннюю FeedDate.

Вот сценарий, основанный на этой логике. Он использует способность PowerShell группировать данные на основе свойства (EmpID) и циклически перебирать каждую группу.

Расхождение: Результат X666 в вашем вопросе смущает меня, как я думаю, 201501 должна быть 201501 , на основе этой логики. Пожалуйста, дайте мне знать, если это не так.

# Import your data as CSV object, grouped by EmpID. NULLs are ignored. 
$data = Import-Csv ".\input.csv" | Where {$_ -notmatch "NULL"}| Group -Property EmpID 

$results = @()  # Intialise array to store your end results. 

foreach ($group in $data){ 

    # For each EmpID, get the LATEST (Max) LastDay. 
    $ld_stats = ($group.Group | Measure -Property "LastDay" -Maximum -Minimum) 
    $lastDay = $ld_stats.Maximum 


    # For each EmpID, where the LastDay is the LATEST (Max), get the EARLIEST FeedDate (Min) 
    $fd_stats = ($group.Group | Where {$_.LastDay -eq $lastDay} |` 
       Measure -Property "FeedDate" -Maximum -Minimum) 
    $feedDate = $fd_stats.Minimum 


    # Put everything together for this particular empID 
    $results += New-Object -TypeName psobject -Property @{` 
       "EmpID"=$($group.name);"LastDay"=$lastDay;"FeedDate"=$feedDate} 

} 

Write $results 
0

Thx для ответа gmsoulman

Это, как я решить ее на самом деле

$BRID - contains all BRID's in csv file (array) 
$LDIO - contains all LDIO's in csv file 
$LOAD_DATE - contains all LOAD_DATEin csv file 

$PrevBRID = $BRID[0] 
$PrevLDIO = $LDIO[0] 
$PrevLOAD_DATE = $LOAD_DATE[0] 

for($i=0; $i -le $BRID.length-1; $i++) 
{ 
$CompBRID = $BRID[$i] 
$CompBRID2 = $BRID[$i+1] 

    if($CompBRID -eq $CompBRID2) 
    { 
    if($LDIO[$i] -ne $LDIO[$i+1]){ 
     $PrevBRID = $BRID[$i+1] 
     $PrevLDIO = $LDIO[$i+1] 
     $PrevLOAD_DATE = $LOAD_DATE[$i+1] 
    } 
    } 
    else{ 
    #Do Logging 
    $writeoutput = "$PrevBRID`t$PrevLDIO`t$PrevLOAD_DATE" | Out-File -FilePath $OutputFile -Append 
    Write-Host "$PrevBRID - $PrevLDIO - $PrevLOAD_DATE" 
    $PrevBRID = $BRID[$i+1] 
    $PrevLDIO = $LDIO[$i+1] 
    $PrevLOAD_DATE = $LOAD_DATE[$i+1] 

    #$writeoutput = "$PrevBRID`t$PrevLDIO`t$PrevLOAD_DATE" | Out-File -FilePath $OutputFile -Append 
    } 
} 

Thx снова на помощь ... высоко ценится :)

Смежные вопросы