Как обновить строку в файле при сравнении с file2 - PullRequest
0 голосов
/ 28 июня 2018

Вот пример входных файлов:

FILE1              FILE2
1,1,1,1,2          6,2,2,2,2
2,2,1,2,1          1,1,1,1,2
3,1,2,1,1          5,3,2,1,2
4,2,1,1,1          8,3,2,5,2
5,1,2,1,1          2,2,2,2,2

Я хочу сначала удалить все строки, которые точно соответствуют другому файлу. Первая строка была удалена, потому что файл 2 уже имеет ее, у меня также есть эта часть кода.

FILE1              FILE2
2,2,1,2,1          6,2,2,2,2
3,1,2,1,1          1,1,1,1,2
4,2,1,1,1          5,3,2,1,2
5,1,2,1,1          8,3,2,5,2
                   2,2,2,2,2

После этого я хотел бы обновить файл 2 строками из file1. Условие для какой строки обновлять является первым числом. Если первый номер в первом столбце совпадает с первым номером в файле 2 первого столбца, он обновит остальные числа в той же строке. Теперь итоговый файл будет выглядеть так. Звездочки показывают изменения, и вот где я застрял.

FILE1              FILE2
2,2,1,2,1          6,2,2,2,2
3,1,2,1,1          1,1,1,1,2
4,2,1,1,1          *5,1,2,1,1*
5,1,2,1,1          8,3,2,5,2
                   *2,2,1,2,1*

Единственная проблема, с которой я сталкиваюсь в данный момент, это последняя часть. Я не уверен, как я должен обновлять числа, я думал об использовании разделения, чтобы мы знали первый столбец чисел и сопоставили это с файлом 2, но я просто не мог понять это. Мой код ниже.

$ref = Get-Content $file2
(Get-Content $file1) |
    ? { $ref -notcontains $_ } |
    Set-Content $file1

$content = Get-Content $file1
(Get-Content $file2 $Column1 = $_.split(',')) |
    ? { $ref -contains $column1} |
    Set-Content $file2

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Я бы использовал общие списки для этой задачи:

Add-Type -AssemblyName System.Collections

[System.Collections.Generic.List[string]]$file1 = @(Get-Content -Path 'file1.txt')
[System.Collections.Generic.List[string]]$file2 = @(Get-Content -Path 'file2.txt')


for( $i = $file1.Count - 1; $i -ge 0; $i-- ) {
    if( $file2 -contains $file1[$i] ) {
        $file1.RemoveAt( $i )
    }
}


foreach( $line in $file1 ) {
    $idx = $file2.FindIndex( { $args[0].Substring(0,1) -eq $line.Substring(0,1) } )
    if( $idx -ge 0 ) {
        $file2[$idx] = $line
    } 
}

#Result:
$file2
0 голосов
/ 28 июня 2018
[Linq.Enumerable]::Except(
   [String[]](Get-Content C:\path\file1.txt),
   [String[]](Get-Content C:\path\file2.txt)
)

Это перезагружается

2,2,1,2,1
3,1,2,1,1
4,2,1,1,1
5,1,2,1,1

для

FILE1              FILE2
1,1,1,1,2          6,2,2,2,2
2,2,1,2,1          1,1,1,1,2
3,1,2,1,1          5,3,2,1,2
4,2,1,1,1          8,3,2,5,2
5,1,2,1,1          2,2,2,2,2

Если в файле есть строки в кавычках, например

FILE1              FILE2
1,1,1,1,2          6,2,2,2,2
2,2,1,2,1          1,1,1,1,2
3,1,2,1,1          "5,3,2,1,2"
4,2,1,1,1          8,3,2,5,2
5,1,2,1,1          "2,2,2,2,2"

1011 * тогда *

[Linq.Enumerable]::Except(
   [String[]](Get-Content C:\path\file1.txt),
   [String[]]((Get-Content C:\path\file2.txt) -replace '"', '')
)

Для выполнения работы

[Linq.Enumerable]::Except(
   [String[]](Get-Content C:\path\file1.txt),
   [String[]]((Get-Content C:\path\file2.txt) -replace '"', '')
) | Out-File C:\path\file1.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...