Дублирующиеся значения, но с разными строками - PullRequest
0 голосов
/ 05 марта 2020

Здравствуйте, если у меня есть 2 таких текстовых файла:

file1

jack : 10
donald : 50
mark : 20
florence : 15
ariel : 50
arnold : 50

file2

jack
country : ohaio

donald
country : italy

mark
country : france

florence
country : china

ariel
country :america

arnold
country: japan

как я могу получить имена стран людей старше 20 лет, циклически изменяя возраст в файле1, чтобы сначала получить имена людей, а затем после того, как я получу имена l oop через них в файле 2, чтобы получить страны .// не знаю, как справиться с повторяющиеся возрасты, это просто примеры файлов, значения которых намного больше.

, поэтому вывод должен выглядеть примерно так:

ages

10
20
50
15
50
50

values over 20

50
50
50

names

donald
ariel
arnold


countries

italy
america
japan

1 Ответ

0 голосов
/ 05 марта 2020

следующий код предполагает, что записи в двух файлах находятся в ТОЧНОЙ одинаковой последовательности ... и в них ТОЧНО одинаковое количество записей. [ ухмылка ]

что он делает ...

  • устанавливает имя и расположение входных файлов
  • создает файлы для работы с
    закомментируйте или удалите этот регион, когда будете готовы работать с реальными данными.
  • читает в 1-м файле как массив из одной строки
  • читает во 2-м файле как массив из 3-х строчных кусков
  • выполняет итерацию по двум коллекциям параллельно, используя порядковый номер 1-й коллекции
    .GetUpperBound(0) получает верхний предел нулевой оси коллекции.
  • строит PSCustomObject из необходимых элементов
    использует $Index, чтобы решить, над чем работать.
    [1] после того, как индекс файла Country захватывает вторую строку из 3 линия
  • отправляет PSCO в коллекцию $Results
  • отображает его на экране
  • фильтрует коллекцию для элементов, у которых свойство .Age превышает 20

код ...

$File_1_Name = "$env:TEMP\3N16M4_File1.txt"
$File_2_Name = "$env:TEMP\3N16M4_File2.txt"

#region >>> create files to work with
$NameAge = @'
jack : 10
donald : 50
mark : 20
florence : 15
ariel : 50
arnold : 50
'@ | Set-Content -LiteralPath $File_1_Name -ErrorAction 'SilentlyContinue'

$NameCountry = @'
jack
country : ohaio

donald
country : italy

mark
country : france

florence
country : china

ariel
country :america

arnold
country: japan
'@  | Set-Content -LiteralPath $File_2_Name -ErrorAction 'SilentlyContinue'
#endregion >>> create files to work with

$NameAge = Get-Content -LiteralPath $File_1_Name
# the "-ReadCount" parameter grabs lines in groups
$NameCountry = Get-Content -LiteralPath $File_2_Name -ReadCount 3

# this code presumes the two files are in the EXACT same sequence
#   and that they have EXACTLY the same number of entries
$Results = foreach ($Index in 0..$NameAge.GetUpperBound(0))
    {
    [PSCustomObject]@{
        Name = $NameAge[$Index].Split(':')[0].Trim()
        Age = $NameAge[$Index].Split(':')[-1].Trim()
        Country = ($NameCountry[$Index][1] -replace '(?ms).+:', '').Trim()
        }
    }

# show whole collection on screen
$Results
'=' * 30
# show the filtered results
$Results.Where({$_.Age -gt 20})

на экране - вся коллекция находится над линией, отфильтрованные элементы находятся под ней ...

Name     Age Country
----     --- -------
jack     10  ohaio  
donald   50  italy  
mark     20  france 
florence 15  china  
ariel    50  america
arnold   50  japan  
==============================
donald   50  italy  
ariel    50  america
arnold   50  japan
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...