Обновление данных в .csv без перезаписи существующих данных / добавление новых данных в PowerShell - PullRequest
1 голос
/ 04 августа 2020

это снова я Powershell-Newb ie (я работаю с PowerShell уже 11 дней).

Итак, в чем проблема, которая у меня есть до сих пор: я читаю файлы csv из разные папки и объединить данные в один большой csv (bigCSV). BigCSV - это живой документ, поэтому я добавляю данные в этот лист вручную.

Что я делаю / Пример

Проблема в том, что если мне нужно обновить bigCSV (с новыми файлами csv) существующий bigCSV перезаписывается, и мои добавленные вручную данные теряются.

Что я делаю / Проблема

Я пытался добавить - добавить в мой код, но результат неудовлетворительный, потому что добавленные вручную данные все еще существуют, но теперь у меня есть дубликаты ...

Новая проблема

Это мой Код на данный момент ...

$Userpath_Access    = "$PSScriptRoot"
$txtFiles = Get-ChildItem -Path $Userpath_Access\txt-Import-Datenbank\ -Filter *.csv -Recurse -ErrorAction SilentlyContinue -Force

$csv = foreach ($file in $txtFiles) {
        Import-Csv -Path $file.FullName -Delimiter ";" | 
                      Select-Object 'Type (BAY)', 'Order Number (BAY)', 'PCP Number (PCP)', @{label='Project ID (Mosaic)';expression={$($_.'Project')}}, 'Priority (BAY)', @{label='Compound No (Mosaic)';expression={$($_.'Compound No')}},
                      @{label='Customer (Mosaic)';expression={$($_.'Requestor')}}, @{label='Date Order Created (Mosaic)';expression={$($_.'Order Date')}},  @{label='Comment (Mosaic)';expression={$($_.'Comment')}}, 'Status', 'Data Finalized', @{label='Compound Amount [mg] (Mosaic)';expression={$($_.'Amount')}},
                      'Mail Address', 'Duration', @{label='Name Of Customer (Mosaic)';expression={$($_.'Requestor')}}, @{label='Vial (Mosaic)';expression={$($_.'Vial')}}, @{label='Mosaic File (Mosaic)';expression={$($_.'Filename')}}, @{label='Date Received (Mosaic)';expression={$($_.'Data import')}},
                      @{label='Order ID (Mosaic)';expression={$($_.'Order ID')}}
}

$fileOut = Join-Path -Path $Userpath_Access -ChildPath ('Inh_Auftragsliste.csv')
$csv | Export-Csv -Path $fileOut -Delimiter ";" -NoTypeInformation -Append

Теперь я ищу решение, чтобы просто добавить «новые файлы» в мой существующий bigCSV.

Ответы [ 3 ]

1 голос
/ 04 августа 2020

Если я правильно понимаю вопрос, вы не за горами со своим кодом. Главное, я думаю, вам нужно добавить преобразованные данные из Import-CSV и Select-Object в большой файл CSV внутри l oop.

Попробуйте:

$Userpath_Access = $PSScriptRoot
$fileOut = Join-Path -Path $Userpath_Access -ChildPath 'Inh_Auftragsliste.csv'  # the BigCSV

$txtFiles = Get-ChildItem -Path "$Userpath_Access\txt-Import-Datenbank" -Filter '*.csv' -File -Recurse -ErrorAction SilentlyContinue -Force

foreach ($file in $txtFiles) {
    Write-Host "Adding data from 'file $($file.FullName)'.."

    Import-Csv -Path $file.FullName -Delimiter ";" | 
        Select-Object 'Type (BAY)', 'Order Number (BAY)', 'PCP Number (PCP)', 
                      @{label='Project ID (Mosaic)';expression={$_.'Project'}}, 
                      'Priority (BAY)', 
                      @{label='Compound No (Mosaic)';expression={$_.'Compound No'}},
                      @{label='Customer (Mosaic)';expression={$_.'Requestor'}}, 
                      @{label='Date Order Created (Mosaic)';expression={$_.'Order Date'}},  
                      @{label='Comment (Mosaic)';expression={$_.'Comment'}}, 
                      'Status', 'Data Finalized',
                      @{label='Compound Amount [mg] (Mosaic)';expression={$_.'Amount'}},
                      'Mail Address', 'Duration', 
                      @{label='Name Of Customer (Mosaic)';expression={$_.'Requestor'}},
                      @{label='Vial (Mosaic)';expression={$_.'Vial'}}, 
                      @{label='Mosaic File (Mosaic)';expression={$_.'Filename'}}, 
                      @{label='Date Received (Mosaic)';expression={$_.'Data import'}},
                      @{label='Order ID (Mosaic)';expression={$_.'Order ID'}} |
    Export-Csv -Path $fileOut -Delimiter ";" -NoTypeInformation -Append
}

Мелкие детали, но я поменял цитату и ненужные $() немного

0 голосов
/ 04 августа 2020

Если посмотреть на предыдущий вопрос , и, если я правильно его понимаю, вы должны указать такие списки объектов, как:

$Old = Import-Csv .\Old.csv

Date       Filename  Type (BAY) ...
----       --------  ---------- ---
2020-08-01 File1.csv Type 1     Info 1
2020-08-02 File2.csv Type 2
2020-08-03 File3.csv Type 3

И:

$New = Import-Csv .\New.csv

Date       Filename  Type (BAY) ...
----       --------  ---------- ---
2020-08-04 File2.csv Type 2     Info 2
2020-08-04 File4.csv Type 4     Info 4

Если вы используете этот Join-Object (см. Также: В Powershell, как лучше всего объединить две таблицы в одну? ), вы можете объединить два списка, например:

$Old | Merge-Object $New -on Filename

Date       Filename  Type (BAY) ...
----       --------  ---------- ---
2020-08-01 File1.csv Type 1     Info 1
2020-08-04 File2.csv Type 2     Info 2
2020-08-03 File3.csv Type 3
2020-08-04 File4.csv Type 4     Info 4
0 голосов
/ 04 августа 2020

Вы можете импортировать CSV-файл в Excel, отсортировать его и использовать флаг -Unique, а затем экспортировать его снова.

Import-Csv C:\temp\UsersConsolidated.csv | sort lname,fname –Unique | Export-Csv C:\temp\UsersConsolidated.csv

Я не думаю, что есть способ справиться с этим при экспорте в CSV .

...