2016-02-07 1 views
-5

Итак, скажем, у меня есть 5 файлов csv (созданных в порядке от 1 до 5) с 8-10 столбцами каждый. Каждый файл имеет около 300 000 (указать или взять) строки.Самый быстрый способ объединить несколько файлов csv на основе значения 1-го столбца

Каждый файл должен соответствовать значению (уникальному) из первого столбца в каждом файле, а затем объединять записи/названия столбцов. Если файлы с 2 по 5 не имеют значения из столбца 1, найденного в файле1 (из столбца 1), вся строка должна быть исключена из слияния.

Пример ниже двух (из 5) CSV файлов ...

File1

ColumnTitle1,ColumnTitle2,ColumnTitle3,ColumnTitle4,ColumnTitle5,ColumnTitle6,ColumnTitle7,ColumnTitle8,ColumnTitle9,ColumnTitle10 
Column1Value3145,Column2Value1,Column3Value1,Column4Value1,Column5Value1,Column6Value1,Column7Valu1,Column8Value1,Column9Value1,Column10Value1 
Column1Value573,Column2Value2,Column3Value2,Column4Value2,Column5Value2,Column6Value2,Column7Valu2,Column8Value2,Column9Value2,Column10Value2 
Column1Value62317,Column2Value3,Column3Value3,Column4Value3,Column5Value3,Column6Value3,Column7Valu3,Column8Value3,Column9Value3,Column10Value3 
Column1Value93,Column2Value4,Column3Value4,Column4Value4,Column5Value4,Column6Value4,Column7Valu4,Column8Value4,Column9Value4,Column10Value4 

File2:

ColumnTitle1,ColumnTitle11,ColumnTitle12,ColumnTitle13,ColumnTitle14,ColumnTitle15,ColumnTitle16,ColumnTitle17,ColumnTitle18 
Column1Value752789,Column11Value1,Column12Value1,Column13Value1,Column14Value1,Column15Value1,Column16Value1,Column17Value1,Column18Value1 
Column1Value3145,Column11Value2,Column12Value2,Column13Value2,Column14Value2,Column15Value2,Column16Value2,Column17Value2,Column18Value2 
Column1Value573,Column11Value3,Column12Value3,Column13Value3,Column14Value3,Column15Value3,Column16Value3,Column17Value3,Column18Value3 
Column1Value832657,Column11Value4,Column12Value4,Column13Value4,Column14Value4,Column15Value4,Column16Value4,Column17Value4,Column18Value4 
Column1Value62317,Column11Value5,Column12Value5,Column13Value5,Column14Value5,Column15Value5,Column16Value5,Column17Value5,Column18Value5 
Column1Value93,Column11Value6,Column12Value6,Column13Value6,Column14Value6,Column15Value6,Column16Value6,Column17Value6,Column18Value6 
Column1Value423568,Column11Value7,Column12Value7,Column13Value7,Column14Value7,Column15Value7,Column16Value7,Column17Value7,Column18Value7 

Если бы я просто объединить эти два файла (2 из 5) это выглядело бы примерно так:

ColumnTitle1,ColumnTitle2,ColumnTitle3,ColumnTitle4,ColumnTitle5,ColumnTitle6,ColumnTitle7,ColumnTitle8,ColumnTitle9,ColumnTitle10,ColumnTitle11,ColumnTitle12,ColumnTitle13,ColumnTitle14,ColumnTitle15,ColumnTitle16,ColumnTitle17,ColumnTitle18 
Column1Value3145,Column2Value1,Column3Value1,Column4Value1,Column5Value1,Column6Value1,Column7Valu1,Column8Value1,Column9Value1,Column10Value1,Column11Value2,Column12Value2,Column13Value2,Column14Value2,Column15Value2,Column16Value2,Column17Value2,Column18Value2 
Column1Value573,Column2Value2,Column3Value2,Column4Value2,Column5Value2,Column6Value2,Column7Valu2,Column8Value2,Column9Value2,Column10Value2,Column11Value3,Column12Value3,Column13Value3,Column14Value3,Column15Value3,Column16Value3,Column17Value3,Column18Value3 
Column1Value62317,Column2Value3,Column3Value3,Column4Value3,Column5Value3,Column6Value3,Column7Valu3,Column8Value3,Column9Value3,Column10Value3,Column11Value5,Column12Value5,Column13Value5,Column14Value5,Column15Value5,Column16Value5,Column17Value5,Column18Value5 
Column1Value93,Column2Value4,Column3Value4,Column4Value4,Column5Value4,Column6Value4,Column7Valu4,Column8Value4,Column9Value4,Column10Value4,Column11Value6,Column12Value6,Column13Value6,Column14Value6,Column15Value6,Column16Value6,Column17Value6,Column18Value6 

Добавление файлов 3 - 5 увеличит столбцы примерно до 50 (дайте или возьмите).

Я не уверен, если это самый быстрый способ, но здесь есть логика, я имею в виду (который я не уверен, как это сделать с помощью PowerShell):

  • Go один файл в то время, чтобы соответствовать и сливаться с файлом один
  • магазина file1 в переменном
  • магазин file2 в переменной
  • Loop через линию в file1
  • \\\\ Где значение1 в column1 из file1 найдены в column1 от file2
  • \\\\ добавить строку из file2 к строке в файла1
  • \\\\ удалить строку из файл2 (уменьшить поиск во время следующей итерации цикла)
  • четких переменным, содержащего файл2
  • магазина следующего файл в переменная
  • повторить цикл поиска и добавления итераций
+0

и где ваш код? – Avshalom

+0

Вы спрашиваете о слиянии или объединении объектов? –

+1

Возможно, вы еще не знаете, как это сделать в PowerShell, но быстрый поиск Google для каждого шага в вашем рецепте будет долгим. Ты на правильном пути. Мы не здесь, чтобы делать вашу работу за вас, но когда у вас есть скрипт, который сломан, мы с радостью поможем вам исправить эту проблему. Вы не научитесь, не пытаясь и не потерпите неудачу. :-) –

ответ

1

Все дороги ведут в Рим. Один из них:

#Hashtable to store master-objects in 
$data = @{} 

#Import-CSV -Filter "MyMasterList.csv" | Foreach-Object { $data[$_.ColumnTitle1] = $_ } 
#Sampledata below 
@" 
ColumnTitle1,ColumnTitle2,ColumnTitle3,ColumnTitle4,ColumnTitle5,ColumnTitle6,ColumnTitle7,ColumnTitle8,ColumnTitle9,ColumnTitle10 
Column1Value3145,Column2Value1,Column3Value1,Column4Value1,Column5Value1,Column6Value1,Column7Valu1,Column8Value1,Column9Value1,Column10Value1 
Column1Value573,Column2Value2,Column3Value2,Column4Value2,Column5Value2,Column6Value2,Column7Valu2,Column8Value2,Column9Value2,Column10Value2 
Column1Value62317,Column2Value3,Column3Value3,Column4Value3,Column5Value3,Column6Value3,Column7Valu3,Column8Value3,Column9Value3,Column10Value3 
Column1Value93,Column2Value4,Column3Value4,Column4Value4,Column5Value4,Column6Value4,Column7Valu4,Column8Value4,Column9Value4,Column10Value4 
"@ | ConvertFrom-Csv | % { $data[$_.ColumnTitle1] = $_ } 

Get-ChildItem -Path "C:\MyOtherCSVs" -Filter "*.csv" | ForEach-Object { Import-Csv -Path $_.FullName } | ForEach-Object { 
    $ID = $_.ColumnTitle1 

    #If row is in MasterList 
    if($data.ContainsKey($ID)) { 
     #Get matching object 
     $obj = $data[$ID] 
     #Foreach line in csv 
     $_.psobject.Properties | Where-Object { $_.Name -ne 'ColumnTitle1' } | ForEach-Object { 
      #Foreach property, add to master-object 
      Add-Member -InputObject $obj -MemberType NoteProperty -Name $_.Name -Value $_.Value 
     } 
     #Put modified object back into hashtable 
     $data[$ID] = $obj 
    } 
} 

$data.Values | Export-Csv -Path "MergedCSV.csv" -NoTypeInformation 

Обязательно упакуйте дополнительную память с большими CSV-файлами.

+0

Я согласен с вами на дорогах до Рима. Я пытался найти способ не делать этого 1 столбец за один раз (с 52 столбцами и 300 000 записей, это будет просто навсегда), а вместо этого просто делать это как целую строку за раз. Пока это хорошо. Я просто жду, когда создадут файлы csv, прежде чем тестировать это. –

+0

занимает около часа в два раза, чтобы объединить 2 файла, но похоже, что он работает. Вероятно, потребуется около 12 часов, чтобы объединить все файлы, но если они не хотят обновлять RAM до 2 гигов, это именно то, с чем им придется иметь дело. Благодарю. –

+0

Вы можете запустить аналогичный подход, прочитав его как текст, разделив первый столбец и используя его как идентификатор в хеш-таблице и присоедините к строке каждый раз, когда он будет соответствовать. Однако, что происходит, если ни одна из строк в одном файле не соответствует идентификаторам в файле1? Как вы узнаете, когда включать заголовки столбцов? Безусловно, вам придется добавлять пустые значения ',,,,,' для строк, отсутствующих в одном файле, но присутствующих в другом и т. Д. У этого не было времени, но поиск в google будет долгим. :-) –