2013-03-03 2 views
0

Я новичок в powershell. В настоящее время мы нуждаемся в скрипте poweshell для сравнения двух больших (100000 строк и n столбцов (n> 300, также заголовки столбцов - это даты, соответствующие каждой неделе). Значение n продолжает увеличиваться каждую неделю в файле. для сравнения файлов (текущая неделя и последняя неделя), и нужно убедиться, что единственная разница между этими двумя файлами - последний столбец.удалить последний столбец из файла csv в powershell

Я прошел через некоторые форумы и блоги, и я мог сделать только мало из-за мое незнание.

Если есть способ удалить последний столбец из файла csv в PowerShell, мы сможем использовать нижеприведенный сценарий ниже, чтобы сравнить файл предыдущей недели и файл текущей недели после того, последний столбец из файла текущей недели.

Было бы очень полезно, если кто-то может помочь мне здесь с трудом заработанных знаниями


[System.Collections.ArrayList]$file1Array = Get-Content "C:\Risk Management\ref_previous.csv"|Sort-Object 
[System.Collections.ArrayList]$file2Array = Get-Content "C:\Risk Management\ref_current.csv"|Sort-Object 
$matchingEntries = @() 

foreach ($entry in $file1Array) { 
    if ($file2Array.Contains($entry)) { 
     $matchingEntries += $entry 
     } 
    } 
foreach ($entry in $matchingEntries){ 
    $file1Array.Remove($entry) 
    $file2Array.Remove($entry) 
    } 

Приветствие, Анил

ответ

1

Если предположить, что имя столбца вы хотите исключить это LastCol (отрегулируйте свое фактическое название столбца):

$previous = Import-csv "C:\Risk Management\ref_previous.csv" | Select-Object -Property * -ExcludeProperty LastCol | Sort-Object; 
$current = Import-csv "C:\Risk Management\ref_current.csv" | Sort-Object; 
Compare-Object $previous $current; 

Это приведет к удалению последнего столбца из каждого входного файла и указывает, отличается ли оставшееся содержимое.

+0

Привет, Спасибо за ответ. Фактически последнее имя столбца меняется на недельном базисе, и мы ищем оппонент, чтобы найти последний столбец Имя текущего файла динамически. – Anil

+0

Также нам нужно удалить последний столбец только из текущего файла. – Anil

+0

Ваш второй комментарий был рассмотрен путем редактирования. Просто удалите 'Select-Object'. – alroc

1

Основываясь на ответе, предоставленном alroc, вы должны иметь возможность получить последнее имя столбца, используя операцию разделения в первой строке файла CSV, а затем используя это в параметре -ExcludeProperty.

Однако команда Compare-Object для этого не работает для меня, но она возвращает нужные данные в каждую переменную.

$CurrentFile = "C:\Temp\Current.csv" 
$PreviousFile = "C:\Temp\Previous.csv" 

$CurrentHeaders = gc $CurrentFile | Select -First 1 
$CurrentHeadersSplit = $CurrentHeaders.Split(",") 
$LastColumn = $CurrentHeadersSplit[-1] -Replace '"' 

$Current = Import-Csv $CurrentFile | Select -Property * -ExcludeProperty $LastColumn | Sort-Object 
$Previous = Import-Csv $PreviousFile | Sort-Object 
Compare-Object $Current $Previous 
0

Импорт-csv и export-csv дают возможность исключать столбцы.

Импорт-csv имеет опцию -header, и вы просто называете входящие заголовки и исключаете заголовок последних столбцов. Если есть 10 столбцов, то только имя 9. Последний столбец будет исключен.

Для экспорта-csv выберите столбцы, которые вы хотите записать (| выберите col1, col2, col3 | export-csv ...) и не выбирайте столбец, который вы пытаетесь исключить.

+0

Привет, господин Джейкинс, Спасибо за ответ. Но есть около 300 столбцов, и его сложно перечислить для пользователя – Anil