Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Поиск в csv файле

Ответить
Настройки темы
PowerShell - [решено] Поиск в csv файле

Аватара для ejik_off

Старожил


Сообщения: 471
Благодарности: 11

Профиль | Отправить PM | Цитировать


Здравствуйте, гуру PS!!!
Есть файл тхт в нем содержатся логины:
ppetrov
iivanov
ssidorov
...
и есть csv файл в формате samaccountname,count
samaccountname,count
ppetrov,1
iivanov,1
ssidorov,2
нужно сделать поиск, т.е логины из тхт файла сравнить с логинами из csv-файла если логин найден, то поле count увеличить на 1, если не найдено то добавить в конец файла в поле samaccountname: логин и в count: 1
Код: Выделить весь код
$txt = get-content c:\tmp\usr.txt
$csv = import-csv c:\tmp\usr_list.csv -Delimiter ","


foreach($user_txt in $txt) {
    foreach($user_csv in $csv){
        if($user_txt -eq $user_csv.samaccountname) {
            как изменить колонку count?
        }
        else {$user_txt,1 | out-file c:\tmp\usr_list.csv -Append - тоже не знаю как правильно вставить}
    }
}

Отправлено: 17:12, 23-12-2019

 

Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


ejik_off, вот взяли бы, да приложили в архиве и тот, и другой файл для облегчения работы отвечающим.

Попробуйте так:
Скрытый текст
Код: Выделить весь код
$sTxtFile    = 'C:\Мои проекты\0289\0001.txt'
$sCSVFile    = 'C:\Мои проекты\0289\0002.csv'

$sTxtContent = Get-Content -Path $sTxtFile
$sCSVContent = Import-Csv  -Path $sCSVFile

$sTxtContent | ForEach-Object -Process {
    $oCSVObject = $sCSVContent | Where-Object -Property 'samaccountname' -eq -Value $_
        if($oCSVObject) {
            $oCSVObject.count = [System.String]([System.Int32]($oCSVObject.count) + 1)
        } else {
            $sCSVContent += [PSCustomObject]@{samaccountname = $_; count = '1'}
        }
}

$sCSVContent | ConvertTo-Csv -NoTypeInformation | ForEach-Object -Process {
    $_.Replace('"','')
} | Set-Content -Path $sCSVFile -Force
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:01, 23-12-2019 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для ejik_off

Старожил


Сообщения: 471
Благодарности: 11

Профиль | Отправить PM | Цитировать


Цитата Iska:
ejik_off, вот взяли бы, да приложили в архиве и тот, и другой файл для облегчения работы отвечающим. »
Прошу прощения, не подумал даже о прикрепе фалов.
Огромное спасибо за скрипт, работает!!!!

Отправлено: 20:38, 23-12-2019 | #3


Забанен


Сообщения: 793
Благодарности: 260

Профиль | Цитировать


Iska, венгерская нотация в PowerShell? Переутомление? Да и лучше сделать так (PowerShell v6):
Код: Выделить весь код
$csv, $txt = (Import-Csv .\input.csv -Delimiter ','), (Get-Content .\input.txt)
$txt.ForEach{
  .({ $csv += [PSCustomObject]@{samaccountname = $_; count = 1} },{
    ++[Int32]$csv[$csv.samaccountname.IndexOf($_)].count
  })[[Byte]($_ -in $csv.samaccountname)]
}
($csv | ConvertTo-Csv) -replace '"' | Out-File .\input.csv
Результат теста производительности:
Код: Выделить весь код
time {
  $csv, $txt = (Import-Csv .\input.csv -Delimiter ','), (Get-Content .\input.txt)
  $txt.ForEach{
    .({ $csv += [PSCustomObject]@{samaccountname = $_; count = 1} },{
      ++[Int32]$csv[$csv.samaccountname.IndexOf($_)].count
    })[[Byte]($_ -in $csv.samaccountname)]
  }
  ($csv | ConvertTo-Csv) -replace '"' | Out-File .\input.csv
}, {
  $sTxtFile    = '.\input1.txt'
  $sCSVFile    = '.\input1.csv'

  $sTxtContent = Get-Content -Path $sTxtFile
  $sCSVContent = Import-Csv  -Path $sCSVFile

  $sTxtContent | ForEach-Object -Process {
      $oCSVObject = $sCSVContent | Where-Object -Property 'samaccountname' -eq -Value $_
          if($oCSVObject) {
              $oCSVObject.count = [System.String]([System.Int32]($oCSVObject.count) + 1)
          } else {
              $sCSVContent += [PSCustomObject]@{samaccountname = $_; count = '1'}
          }
  }

  $sCSVContent | ConvertTo-Csv -NoTypeInformation | ForEach-Object -Process {
      $_.Replace('"','')
  } | Set-Content -Path $sCSVFile -Force
}

# итог:
Total ms: 37.7992
Total ms: 108.8279
Как говорится, почувствуйте разницу.

Отправлено: 21:27, 23-12-2019 | #4


Аватара для ejik_off

Старожил


Сообщения: 471
Благодарности: 11

Профиль | Отправить PM | Цитировать


greg zakharov, классно, осталось понять как он работает )))

Отправлено: 05:43, 24-12-2019 | #5


Аватара для ejik_off

Старожил


Сообщения: 471
Благодарности: 11

Профиль | Отправить PM | Цитировать


на рабочем компе скрипт не работает, видно версии PS разные. На раб.станции версия 5.1.17763.771
Скрытый текст

Сбой вызова метода из-за отсутствия в [System.Management.Automation.PSObject] метода с именем "op_Addition".

строка:12 знак:8

+ $sCSVContent += [PSCustomObject]@{samaccountname = $_; count = ...

+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : InvalidOperation: (op_Addition:String) [], RuntimeException

+ FullyQualifiedErrorId : MethodNotFound

как адаптировать скрипт?

Отправлено: 07:53, 24-12-2019 | #6


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6491
Благодарности: 1465

Профиль | Отправить PM | Цитировать


ejik_off, используйте первый вариант. Вряд ли в данном случае разница в 70 миллисекунд имеет большое значение.

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 08:55, 24-12-2019 | #7


Аватара для ejik_off

Старожил


Сообщения: 471
Благодарности: 11

Профиль | Отправить PM | Цитировать


оба варианта дают такую ошибку

Отправлено: 09:11, 24-12-2019 | #8


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6491
Благодарности: 1465

Профиль | Отправить PM | Цитировать


ejik_off, дайте примеры файлов, хоть будет на чём протестировать.

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 09:36, 24-12-2019 | #9


Аватара для ejik_off

Старожил


Сообщения: 471
Благодарности: 11

Профиль | Отправить PM | Цитировать


прикрепил архив

Последний раз редактировалось ejik_off, 01-05-2020 в 16:09.


Отправлено: 10:13, 24-12-2019 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Поиск в csv файле

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
PowerShell - поиск по части IP адреса в CSV файле God-of-Chaos Скриптовые языки администрирования Windows 3 06-11-2017 10:45
PowerShell - [решено] Переименование дублей в csv файле YURETZS Скриптовые языки администрирования Windows 3 20-10-2017 11:42
CMD/BAT - Поиск цифр в текстовом файле и последующий их поиск в названии файлов массива (лог.) antares_80@vk Скриптовые языки администрирования Windows 10 25-10-2015 11:34
PowerShell - [решено] Поиск и вставка информации из одного csv-файла в другой IvanXXL Скриптовые языки администрирования Windows 1 20-07-2011 12:48
PowerShell - [решено] Поиск и удаление дублей в csv-файле IvanXXL Скриптовые языки администрирования Windows 4 19-07-2011 13:14




 
Переход