none
Объединить три csv файла с помощью PowerShell RRS feed

  • Вопрос

  • Ребята нужна помощь в написании скрипта который мог объединить 3 csv файла в один. Со следующими условиями:
    1. Скрипт должен объединить 3 файла в один по столбцам
    2. Столбцы не должны дублироваться
    3. Файлы сравниваются между собой  по строково
    4. Кол-во столбцов в файлах разное

    Первый файл

    ID

    Account

    TTR

    12345

    sas

    GDR

    56789

    pas


    96352

    tas

    GDR

    Второй файл

    ID

    Balance

    ContractID

    12345

    3000

    11

    56789

    2000

    22

    Третий файл

    ContractID

    AccountID

    11

    101

    22

    102

    33

    103

    В итоге должен получиться четвертый файл

    ID

    Account

    TTR

    Balance

    ContractID

    AccountID

    12345

    sas

    GDR

    3000

    11

    101

    56789

    pas


    2000

    22

    102

    96352

    tas

    GDR

     

     

     

     

     

     

     

    33

    103

    Спасибо.


    • Изменено SSVan 16 июня 2015 г. 10:52
    16 июня 2015 г. 10:22

Ответы

  • Merge-Csv -Path 1.csv,2.csv -Id ID,TTR,Date -Delimiter ";" | Export-Csv 4.csv -NoTypeInformation -UseCulture -Encoding UTF8
    Merge-Csv -Path 3.csv,4.csv -Id ContractID,Date -Delimiter ";" | Export-Csv result.csv -NoTypeInformation -UseCulture -Encoding UTF8

    • Помечено в качестве ответа KazunEditor 6 июля 2015 г. 6:23
    24 июня 2015 г. 8:29
    Отвечающий

Все ответы

  • Формат CSV:

    ID,Account,TTR
    12345,sas,GDR
    56789,pas,
    96352,tas,GDR
    ID,Balance,ContractID
    12345,3000,11
    56789,2000,22
    
    ContractID,AccountID
    11,101
    22,102
    33,103

    $f1 = import-csv 1.csv | Select-Object ID,Account,TTR,Balance,ContractID,AccountID
    $f2 = import-csv 2.csv | Select-Object ID,Account,TTR,Balance,ContractID,AccountID
    $f3 = import-csv 3.csv | Select-Object ID,Account,TTR,Balance,ContractID,AccountID
    
    $cs = $f1+$f2 | Group ID | Foreach {
    	[pscustomobject][ordered]@{
    		ID = $_.Name
    		Account = ($_.group | Where {$_.Account} | Select -First 1).Account
    		TTR =  ($_.group | Where {$_.TTR} | Select -First 1).TTR
    		Balance =  ($_.group | Where {$_.Balance} | Select -First 1).Balance
    		ContractID = ($_.group | Where {$_.ContractID} | Select -First 1).ContractID
    		AccountID =  ($_.group | Where {$_.AccountID} | Select -First 1).AccountID
    	}	
    } 
    
    $cs + $f3 | Group ContractID | Foreach {
    	[pscustomobject][ordered]@{
    		ID = ($_.group | Where {$_.ID} | Select -First 1).ID
    		Account = ($_.group | Where {$_.Account} | Select -First 1).Account
    		TTR =  ($_.group | Where {$_.TTR} | Select -First 1).TTR
    		Balance =  ($_.group | Where {$_.Balance} | Select -First 1).Balance
    		ContractID = ($_.group | Where {$_.ContractID} | Select -First 1).ContractID
    		AccountID =  ($_.group | Where {$_.AccountID} | Select -First 1).AccountID
    	}	
    } | Export-Csv result.csv -NoTypeInformation -Encoding UTF8




    • Изменено KazunEditor 16 июня 2015 г. 11:43
    16 июня 2015 г. 11:43
    Отвечающий
  • При выполнении скрипта выдает ошибку:

    Сбой вызова метода из-за отсутствия в [System.Management.Automation.PSObject] метода с именем "op_Addition".
    строка:16 знак:1
    + $cs + $f3 | Group ContractID | Foreach {
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (op_Addition:String) [], RuntimeException
        + FullyQualifiedErrorId : MethodNotFound

    17 июня 2015 г. 6:31
  • Заменить $cs + $f3 на :

    ,$cs + $f3
    Но для начала проверить, что попадает в $cs. 
    • Изменено KazunEditor 17 июня 2015 г. 6:45
    17 июня 2015 г. 6:44
    Отвечающий
  • Скрипт отработал. Но файл с результатом получился следующий. Все названия столбцов в одном столбце, данных нет.


    17 июня 2015 г. 7:47
  • Вывод переменных: $f1,$f2,$f3
    17 июня 2015 г. 7:48
    Отвечающий
  • Да, вывод всех переменных.
    17 июня 2015 г. 8:02
  • Да, вывод всех переменных.
    Приведите скрин, вывод этих переменных.
    17 июня 2015 г. 8:04
    Отвечающий
  • Разговор обещает быть интересным :)
    17 июня 2015 г. 8:13
    Модератор
  • Сильно.

    1) Выделяем строки $f1,$f2,$f3

    2) Нажимаем F8 (Выполнить выделенный фрагмент)

    3) Переходим в область исполнения скриптов

    4) Пишем $f1,$f2,$f3  

    5) Нажимаем Enter

    Скрин с выводом содержимого этих переменных предоставить сюда.

    17 июня 2015 г. 8:15
    Отвечающий
  • Сорри, я не сильный знаток PowerShell.

    17 июня 2015 г. 8:28
  • Разделитель в файле я так понимаю ";" , а не запятая? Приведите пример файла 1.csv.
    17 июня 2015 г. 8:31
    Отвечающий
  • Файл лучше открыть в блокноте
    17 июня 2015 г. 8:37
    Модератор
  • Да, разделитель используется ";". Пример:

    Заменил разделитель во всех файлах на ",", результат:


    17 июня 2015 г. 8:55
  • Оставить разделитель ";" в файлах:

    $f1 = import-csv 1.csv -Delimiter ";" | Select-Object ID,Account,TTR,Balance,ContractID,AccountID
    $f2 = import-csv 2.csv -Delimiter ";" | Select-Object ID,Account,TTR,Balance,ContractID,AccountID
    $f3 = import-csv 3.csv -Delimiter ";" | Select-Object ID,Account,TTR,Balance,ContractID,AccountID
    
    $cs = $f1+$f2 | Group ID | Foreach {
    	[pscustomobject][ordered]@{
    		ID = $_.Name
    		Account = ($_.group | Where {$_.Account} | Select -First 1).Account
    		TTR =  ($_.group | Where {$_.TTR} | Select -First 1).TTR
    		Balance =  ($_.group | Where {$_.Balance} | Select -First 1).Balance
    		ContractID = ($_.group | Where {$_.ContractID} | Select -First 1).ContractID
    		AccountID =  ($_.group | Where {$_.AccountID} | Select -First 1).AccountID
    	}	
    } 
    
    $cs + $f3 | Group ContractID | Foreach {
    	[pscustomobject][ordered]@{
    		ID = ($_.group | Where {$_.ID} | Select -First 1).ID
    		Account = ($_.group | Where {$_.Account} | Select -First 1).Account
    		TTR =  ($_.group | Where {$_.TTR} | Select -First 1).TTR
    		Balance =  ($_.group | Where {$_.Balance} | Select -First 1).Balance
    		ContractID = ($_.group | Where {$_.ContractID} | Select -First 1).ContractID
    		AccountID =  ($_.group | Where {$_.AccountID} | Select -First 1).AccountID
    	}	
    } | Export-Csv result.csv -UseCulture -NoTypeInformation -Encoding UTF8

    17 июня 2015 г. 9:07
    Отвечающий
  • Уважаемы Kazun. Не могли бы Вы помочь в реализации скрипта и выборе правильного условия объединения файлов.

    Первичное условие:

    • Нужно получить информацию из 3 файлов CSV в один CSV
    • Для объединения первых двух файлов необходимо использовать два столбца (ID, TTR), в результате полученный файл + третий файл по столбцу ContractID
    • Одинаковые столбцы в файле объединить между собой равенством \группировать (файл1ID=файл2ID, файл1TTR=файл2TTR, файл1+2(CS)ContractID=файл3ContractID,)

     

    Пример CSV файлов:

     

    ID,Account,TTR, Date
    12345;sas;GDR;06.08.2013

    12345;sas;GDR;07.08.2013

    ID
    ,TTR,Balance,ContractID,Date
    12345;GDR;3000,11;06.08.2013
    12345;GDR;2000,11;08.08.2013

    12345;GDR;1000,11;09.08.2013

    ContractID,AccountID,Date
    11;101;10.08.2013

     

    Result:

    ID,Account,TTR,Date,Balance,ContractID,AccountID

    12345;sas;GDR;06.08.2013;3000;11;101
    12345;sas;GDR;07.08.2013;        ;11;101

    12345;sas;GDR;08.08.2013;2000;11;101

    12345;sas;GDR;09.08.2013;1000;11;101

    12345;sas;GDR;10.08.2013;        ;11;101

     

    Спасибо.

    18 июня 2015 г. 8:20
  • В файлах все разделители должны быть ; ,а то местами стоит запятая.

    $f1 = import-csv 1.csv -Delimiter ";" | Select-Object ID,Account,TTR,Date,Balance,ContractID,AccountID
    $f2 = import-csv 2.csv -Delimiter ";" | Select-Object ID,Account,TTR,Date,Balance,ContractID,AccountID
    $f3 = import-csv 3.csv -Delimiter ";" | Select-Object ID,Account,TTR,Date,Balance,ContractID,AccountID
    
    $cs = $f1+$f2 | Group ID,TTR | Foreach {
    	$ia = $_.group | Where {$_.Id -and $_.Account} | Select ID,Account -First 1
    	$ci = ($_.group | Where {$_.ContractID} | Select -First 1).ContractID
    	$_.Group | Group Date | Foreach {
    		[pscustomobject][ordered]@{
    			ID = $ia.ID
    			Account = $ia.Account
    			TTR =  ($_.group | Where {$_.TTR} | Select -First 1).TTR
    			Date = ($_.group | Where {$_.Date} | Select -First 1).Date
    			Balance =  ($_.group | Where {$_.Balance} | Select -First 1).Balance
    			ContractID = $ci
    			AccountID =  ($_.group | Where {$_.AccountID} | Select -First 1).AccountID
    		}
    	}
    } 
    
    $cs + $f3 | Group ContractID | Foreach {
    	$ai = ($_.group | Where {$_.AccountID} | Select AccountID -First 1).AccountID
    	$id = ($_.group | Where {$_.ID} | Select ID -First 1).ID
    	$ac = ($_.group | Where {$_.Account} | Select Account -First 1).Account
    	$ttr = ($_.group | Where {$_.TTR} | Select TTR -First 1).TTR
    	$ci = ($_.group | Where {$_.ContractID} | Select -First 1).ContractID
    	$_.group | Group Date | Foreach {
    		[pscustomobject][ordered]@{
    			ID = $id
    			Account = $ac
    			TTR =  $ttr
    			Date = $_.Name
    			Balance =  ($_.group | Where {$_.Balance} | Select -First 1).Balance
    			ContractID = $ci
    			AccountID =  $ai
    		}
    	}
    } | Export-Csv result.csv -UseCulture -NoTypeInformation -Encoding UTF8
    

    • Предложено в качестве ответа Vector BCOModerator 18 июня 2015 г. 10:21
    18 июня 2015 г. 9:53
    Отвечающий
  • Добрый день,

    Нашел скрипт(пример скрипта указан ниже) который джойнит CSV файлы по столбцу из этой статьи http://www.powershelladmin.com/wiki/An_Advanced_Cmdlet_to_Merge_Csv_Files_in_PowerShell . Но на выходе получается пустой файл. Не могли бы Вы помочь разобраться почему формируется пустой файл. Спасибо.

    PS C:\Excel> Get-Content .\file2.csv
    TTR;ID;Balance;ContractID;Date
    gdr;12345;3000;11;06.08.2013
    gdr;12345;2000;11;08.08.2013
    gdr;12345;1000;11;09.08.2013

    PS C:\Excel> Get-Content .\file1.csv
    Account;ID;TTR ;DATE
    sas;12345;gdr;06.08.2013
    sas;12345;gdr;07.08.2013

    PS C:\Excel> .\Merge-Csv.ps1 -path file1.csv, file2.csv -Id ID -Delimiter ';' | Export-Csv -NoTypeInformation -Encoding UTF8 resultfile.csv

    Пример скрипта Merge-Csv.ps1

                                                                                                                                                                    

    <#
    .SYNOPSIS
    Merges an arbitrary amount of CSV files based on an ID column or several combined ID columns.

    Author: Joakim Svendsen,
    Svendsen Tech (C) 2014,
    All rights reserved.

    .EXAMPLE
    ipcsv users.csv | ft -AutoSize

    Username Department
    -------- ----------
    John     IT        
    Jane     HR        

    PS C:\> ipcsv user-mail.csv | ft -AutoSize

    Username Email           
    -------- -----           
    John     john@example.com
    Jane     jane@example.com

    PS C:\> Merge-Csv -Path users.csv, user-mail.csv -Shared Username | Export-Csv -enc UTF8 merged.csv

    PS C:\> ipcsv .\merged.csv | ft -AutoSize

    Username Department Email           
    -------- ---------- -----           
    John     IT         john@example.com
    Jane     HR         jane@example.com

    .EXAMPLE
    Merge-Csv -In (ipcsv .\csv1.csv), (ipcsv csv2.csv), (ipcsv csv3.csv) -SharedColumn Username | sort username | ft -AutoSize

    Merging three files.

    WARNING: Duplicate identifying (shared column(s) ID) entry found in CSV data/file 0: user42
    WARNING: Identifying column entry 'firstOnly' was not found in all CSV data objects/files. Found in object/file no.: 1
    WARNING: Identifying column entry '2only' was not found in all CSV data objects/files. Found in object/file no.: 2
    WARNING: Identifying column entry 'user2and3only' was not found in all CSV data objects/files. Found in object/file no.: 2, 3

    Username      File1A      File1B      TestID File2A  File2B  TestX      File3  
    --------      ------      ------      ------ ------  ------  -----      -----  
    2only                                        a       b       c                 
    firstOnly     firstOnlyA1 firstOnlyB1 foo                                      
    user1         1A1         1B1         same   1A3     2A3     same       same   
    user2         2A1         2B1         diff2  2A3     2B3     diff2_2    testC2 
    user2and3only                                2and3A2 2and3B2 test2and3X testID 
    user3         3A1         3B1         same   3A3     3B3     same       same   
    user42        42A1        42B1        same42 testA42 testB42 testX42    testC42

    .EXAMPLE
    Merge-Csv -Path csvmerge1.csv, csvmerge2.csv, csvmerge3.csv -SharedColumn Username, TestID | sort username | ft -a

    Two shared/ID column, three filess.

    WARNING: Duplicate identifying (shared column(s) ID) entry found in CSV data/file 1: user42, same42
    WARNING: Identifying column entry 'user2, diff2' was not found in all CSV data objects/files. Found in object/file no.: 1
    WARNING: Identifying column entry 'user2and3only, testID' was not found in all CSV data objects/files. Found in object/file no.: 3
    WARNING: Identifying column entry 'user2, testC2' was not found in all CSV data objects/files. Found in object/file no.: 3
    WARNING: Identifying column entry '2only, c' was not found in all CSV data objects/files. Found in object/file no.: 2
    WARNING: Identifying column entry 'user2and3only, test2and3X' was not found in all CSV data objects/files. Found in object/file no.: 2
    WARNING: Identifying column entry 'user2, diff2_2' was not found in all CSV data objects/files. Found in object/file no.: 2
    WARNING: Identifying column entry 'firstOnly, foo' was not found in all CSV data objects/files. Found in object/file no.: 1

    Username      TestID     File1A      File1B      File2A  File2B 
    --------      ------     ------      ------      ------  ------ 
    2only         c                                  a       b      
    firstOnly     foo        firstOnlyA1 firstOnlyB1                
    user1         same       1A1         1B1         1A3     2A3    
    user2         diff2      2A1         2B1                        
    user2         diff2_2                            2A3     2B3    
    user2         testC2                                            
    user2and3only testID                                            
    user2and3only test2and3X                         2and3A2 2and3B2
    user3         same       3A1         3B1         3A3     3B3    
    user42        same42     42A1        42B1        testA42 testB42

    #>
    function Merge-Csv {
        [CmdletBinding(
            DefaultParameterSetName='Files'
        )]
        param(
            # Shared ID column(s)/header(s).
            [Parameter(Mandatory=$true)][ValidateNotNullOrEmpty()][string[]] $Id,
            # CSV files.
            [Parameter(ParameterSetName='Files',Mandatory=$true)][ValidateScript({Test-Path $_ -PathType Leaf})][string[]] $Path,
            # Input custom PowerShell objects.
            [Parameter(ParameterSetName='Objects',Mandatory=$true)][psobject[]] $InputObject,
            # Optional delimiter that's used if you pass file paths (default is a comma).
            [string] $Delimiter = ',',
            # Optional multi-ID column string separator (default "#Merge-Csv-Separator#").
            [string] $Separator = '#Merge-Csv-Separator#'
        )

        [psobject[]] $CsvObjects = @()
        if ($PSCmdlet.ParameterSetName -eq 'Files') {
            $CsvObjects = foreach ($File in $Path) { ,@(Import-Csv -Delimiter $Delimiter -Path $File) }
        }
        else {
            $CsvObjects = $InputObject
        }

        $Headers = @()
        foreach ($Csv in $CsvObjects) {
            $Headers += , @($Csv | Get-Member -MemberType NoteProperty | Select -ExpandProperty Name)
        }

        $Counter = 0
        foreach ($h in $Headers) {
            $Counter++
            foreach ($Column in $Id) {
                if ($h -notcontains $Column) {
                    Write-Error "Headers in object/file $Counter doesn't include $Column. Exiting."
                    return
                }
            }
        }

        $HeadersFlatNoShared = $Headers | ForEach-Object { $_ } | Where-Object { $Id -notcontains $_ }
        if ($HeadersFlatNoShared.Count -ne ($HeadersFlatNoShared | Sort-Object -Unique).Count) {
            Write-Error "Some headers are shared. Are you just looking for '@(ipcsv csv1) + @(ipcsv.csv2) | Export-Csv ...'?`nTo remove duplicate (between the files to merge) headers from a CSV file, Import-Csv it, pass it to Select-Object, and omit the duplicate header(s)/column(s).`nExiting."
            return
        }

        $SharedColumnHashes = @()
        $SharedColumnCount = $Id.Count
        $Counter = 0
        foreach ($Csv in $CsvObjects) {

            $SharedColumnHashes += @{}

            $Csv | ForEach-Object {
                $CurrentID = $(for ($i=0; $i -lt $SharedColumnCount; $i++) {
                    $_ | Select -ExpandProperty $Id[$i] -EA SilentlyContinue
                }) -join $Separator

                if (-not $SharedColumnHashes[$Counter].ContainsKey($CurrentID)) {
                    $SharedColumnHashes[$Counter].Add($CurrentID, ($_ | Select -Property $Headers[$Counter]))
                }
                else {
                    Write-Warning ("Duplicate identifying (shared column(s) ID) entry found in CSV data/file $($Counter+1): " + ($CurrentID -replace ([regex]::Escape($Separator)), ', '))
                }
            } 

            $Counter++

        }

        $Result   = @{}
        $NotFound = @{}

        foreach ($Counter in 0..($SharedColumnHashes.Count-1)) {

            foreach ($InnerCounter in (0..($SharedColumnHashes.Count-1) | Where-Object { $_ -ne $Counter })) {

                foreach ($Key in $SharedColumnHashes[$Counter].Keys) {
                    Write-Verbose "Key: $Key, Counter: $Counter, InnerCounter: $InnerCounter"
                    $Obj = New-Object PSObject
                    if ($SharedColumnHashes[$InnerCounter].ContainsKey($Key)) {

                        foreach ($Header in $Headers[$InnerCounter]) {
                            if ($Id -notcontains $Header) {
                                Add-Member -InputObject $Obj -MemberType NoteProperty -Name $Header -Value ($SharedColumnHashes[$InnerCounter].$Key | Select $Header)
                            }
                        }

                    }
                    else {
                        foreach ($Header in $Headers[$Counter]) {
                            if ($Id -notcontains $Header) {
                                Add-Member -InputObject $Obj -MemberType NoteProperty -Name $Header -Value ($SharedColumnHashes[$Counter].$Key | Select $Header)
                            }
                        }
                        if (-not $NotFound.ContainsKey($Key)) {
                            $NotFound.Add($Key, (@($Counter)))
                        }
                        else {
                            $NotFound[$Key] += $Counter
                        }
                    }

                    if (-not $Result.ContainsKey($Key)) {
                        $Result.$Key = $Obj
                    }
                    else {
                        foreach ($Property in $Obj | Get-Member -MemberType NoteProperty | Select -ExpandProperty Name) {
                            if (-not ($Result.$Key | Get-Member -MemberType NoteProperty -Name $Property)) {
                                Add-Member -InputObject $Result.$Key -MemberType NoteProperty -Name $Property -Value $Obj.$Property #-EA SilentlyContinue
                            }
                        }
                    }

                }

            }

        }

        if ($NotFound) {
            foreach ($Key in $NotFound.Keys) {
                Write-Warning "Identifying column entry '$($Key -replace ([regex]::Escape($Separator)), ', ')' was not found in all CSV data objects/files. Found in object/file no.: $(
                    if ($NotFound.$Key) { ($NotFound.$Key | %{([int]$_)+1} | Sort -Unique) -join ', '}
                    elseif ($CsvObjects.Count -eq 2) { '1' }
                    else { 'none' }
                    )"
            }
        }

        #$Global:Result = $Result

        $Counter = 0
        [hashtable[]] $SharedHeaders = $Id | ForEach-Object {
            @{n="$($Id[$Counter])";e=[scriptblock]::Create("(`$_.Name -split ([regex]::Escape('$Separator')))[$Counter]")}
            $Counter++
        }

        [hashtable[]] $HeaderProperties = $HeadersFlatNoShared | ForEach-Object {
            @{n=$_.ToString(); e=[scriptblock]::Create("`$_.Value.'$_' | Select -ExpandProperty '$_'")}
        }

        # Return results.
        $Result.GetEnumerator() | Select -Property ($SharedHeaders + $HeaderProperties)

    }

    22 июня 2015 г. 10:40
  • Колонки должны быть идентичны, если есть пробел должен быть и в другой.

    PS C:\Excel> Get-Content .\file1.csv
    Account;ID;TTR ;DATE

    В скрипте надо указывать все общие колонки.

    PS > Merge-Csv -Path .\1.csv,.\2.csv -Id ID,TTR,Date -Delimiter ";" | ft -a
    ПРЕДУПРЕЖДЕНИЕ: Identifying column entry '12345, gdr, 09.08.2013' was not found in all CSV data objects/files. Found in
     object/file no.: 1
    ПРЕДУПРЕЖДЕНИЕ: Identifying column entry '12345, gdr, 08.08.2013' was not found in all CSV data objects/files. Found in
     object/file no.: 1
    ПРЕДУПРЕЖДЕНИЕ: Identifying column entry '12345, gdr, 07.08.2013' was not found in all CSV data objects/files. Found in
     object/file no.: 2
    
    ID    TTR Date       Balance ContractID Account
    --    --- ----       ------- ---------- -------
    12345 gdr 06.08.2013 3000    11         sas
    12345 gdr 09.08.2013 1000    11
    12345 gdr 08.08.2013 2000    11
    12345 gdr 07.08.2013                    sas

    22 июня 2015 г. 11:01
    Отвечающий
  • Файл на выходе имеет следующий вид:

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

    Спасибо

    22 июня 2015 г. 11:56
  • 1) export-csv -Delimiter ";" ...

    2) Excel - Данные - Текст по столбцам - С разделителями - Чекбокс запятая

    22 июня 2015 г. 12:14
    Модератор
  • Добрый день, при использовании вышеуказанного скрипта столкнулся с тем, что не показывает строки в столбце Account состоящие из русского языка(кириллицы). Как это пофиксить? Спасибо.

    PS C:\Excel> Merge-Csv -Path .\file1.csv,.\file2.csv -Id ID,TTR,Date -Delimiter ";" | ft -a
    ПРЕДУПРЕЖДЕНИЕ: Identifying column entry '12345, gdr, 08.08.2013' was not found in all CSV data objects/files. Found in object/file no.: 2
    ПРЕДУПРЕЖДЕНИЕ: Identifying column entry '12345, gdr, 07.08.2013' was not found in all CSV data objects/files. Found in object/file no.: 1
    ПРЕДУПРЕЖДЕНИЕ: Identifying column entry '12345, gdr, 09.08.2013' was not found in all CSV data objects/files. Found in object/file no.: 2
    
    ID    TTR Date       Account Balance ContractID
    --    --- ----       ------- ------- ----------
    12345 gdr 08.08.2013         2000    11        
    12345 gdr 06.08.2013 ����    3000    11        
    12345 gdr 09.08.2013         1000    11        
    12345 gdr 07.08.2013 ����                      

    23 июня 2015 г. 11:44
  • Соответственно файлы csv должны быть в кодировке UTF8:

    Merge-Csv -Path .\file1.csv,.\file2.csv -Id ID,TTR,Date -Delimiter ";" -Encoding UTF8

    23 июня 2015 г. 11:45
    Отвечающий
  • Выдает ошибку:

    PS C:\Excel> Merge-Csv -Path .\file1.csv,.\file2.csv -Id ID,TTR,Date -Delimiter ";" -Encoding UTF8  | ft -a
    Merge-Csv : Не удается найти параметр, соответствующий имени параметра "Encoding".
    строка:1 знак:72
    + Merge-Csv -Path .\file1.csv,.\file2.csv -Id ID,TTR,Date -Delimiter ";" -Encoding ...
    +                                                                        ~~~~~~~~~
        + CategoryInfo          : InvalidArgument: (:) [Merge-Csv], ParameterBindingException
        + FullyQualifiedErrorId : NamedParameterNotFound,Merge-Csv
     

    Сделал выгрузку в файл:

    PS C:\Excel> Merge-Csv -Path .\file1.csv,.\file2.csv -Id ID,TTR,Date -Delimiter ";" |  Export-Csv -Delimiter ";" -NoTypeInformation -Encoding UTF8 result.csv
    ПРЕДУПРЕЖДЕНИЕ: Identifying column entry '12345, gdr, 08.08.2013' was not found in all CSV data objects/files. Found in object/file no.: 2
    ПРЕДУПРЕЖДЕНИЕ: Identifying column entry '12345, gdr, 07.08.2013' was not found in all CSV data objects/files. Found in object/file no.: 1
    ПРЕДУПРЕЖДЕНИЕ: Identifying column entry '12345, gdr, 09.08.2013' was not found in all CSV data objects/files. Found in object/file no.: 2

    В результате получился CSV файл с используемой кодировкой UTF8

    ID	TTR	Date	Account	Balance	ContractID
    12345	gdr	08.08.2013		2000	11
    12345	gdr	06.08.2013	����	3000	11
    12345	gdr	09.08.2013		1000	11
    12345	gdr	07.08.2013	����		
    

    23 июня 2015 г. 12:40
  • .\file1.csv,.\file2.csv - Должны быть в кодировке UTF8 , т.к. кодировка отличная, то и в выходной файл имеет неправильный результат.

    Открыть файлы в notepad - Сохранить как - выбрать кодировку UTF8.

    23 июня 2015 г. 13:07
    Отвечающий
  • Уважаемый Kazun,

    Не могли бы Вы помочь использовать вышеуказанный скрипт для объединения 3 файлов. Скрипт должен состоять из одного файла. Первые 2 файла должны объединиться по столбцам (ID,TTR,DATE). Полученный результат должен объединиться с 3 файлом по столбцу ContractID. В итоге результат должен экспортироваться в csv файл. 

    Спасибо.

    PS C:\Excel> Get-Content file1.csv
    Account;ID;TTR;DATE
    sas;12345;gdr;06.08.2013
    sas;12345;gdr;07.08.2013
    
    PS C:\Excel> Get-Content file2.csv
    TTR;ID;Balance;ContractID;Date
    gdr;12345;3000;11;06.08.2013
    gdr;12345;2000;11;08.08.2013
    gdr;12345;1000;11;09.08.2013
    
    PS C:\Excel> Get-Content file3.csv
    ContractID;AccountID;Date
    11;101;10.08.2013

    24 июня 2015 г. 7:54
  • Merge-Csv -Path 1.csv,2.csv -Id ID,TTR,Date -Delimiter ";" | Export-Csv 4.csv -NoTypeInformation -UseCulture -Encoding UTF8
    Merge-Csv -Path 3.csv,4.csv -Id ContractID,Date -Delimiter ";" | Export-Csv result.csv -NoTypeInformation -UseCulture -Encoding UTF8

    • Помечено в качестве ответа KazunEditor 6 июля 2015 г. 6:23
    24 июня 2015 г. 8:29
    Отвечающий