Як з'єднати два файли CSV?


22

Припустимо, у вас є один файл CSV з 2 полями: ідентифікатор та електронна пошта. У вас є ще один файл з 2 полями: електронна пошта та ім’я. Як можна створити файл із усіма трьома полями, приєднаними до електронної пошти?


5
Трохи детальніше про стик (тобто внутрішній, зовнішній, лівий). Чи ідентичний список електронної пошти в 1-му CSV другому списку? Або один містить більше?
hyperslug

Приклади файлів CSV були б корисні разом із ОС, яку ви використовуєте?
Троггі

Я думаю, що 1-й і 2-й список однакові. Я використовую Linux. Будь ласка, допоможіть!!! Спасибі!! :)
crst53

1
наскільки великі дані?
Джошуа

Відповіді:


24

Версія3 :

Ви повинні сортувати обидва списки по електронній пошті за алфавітом, а потім приєднатись. Враховуючи, що поле електронної пошти 2-е поле file1 та 1-е поле file2:

sort -t , -k 2,2 file1.csv > sort1.csv
sort -t , -k 1,1 file2.csv > sort2.csv
join -t , -1 2 -2 1 sort1.csv sort2.csv > sort3.csv

значення параметра

-t,: ',' - роздільник поля
-k 2,2: сортування символів у 2-му полі
-k 1,1: сортування символів на 1-му полі
-1 2: файл 1, 2-е поле
-2 1: файл 2, 1-е поле
>: вихід у файл

виробляє

електронна адреса, ідентифікатор, ім’я
електронна адреса, ідентифікатор, ім’я
...

відсортовано за електронною поштою за алфавітом.

Зауважте, що якщо в будь-якому файлі відсутній якийсь електронний лист, він буде опущений з результатів.


2
CSV складніше, ніж це. Наприклад, роздільник поля може бути уникнути.
pguardiario

@hyperslug Чи можу я зробити повне зовнішнє приєднання?
Абу Шойб

Це не спрацює, якщо CSV змішано з цитатами та цитатами, якщо ідентифікатор містить коми. Використовуйте це рішення лише для разової обробки, коли ви перевіряєте результат. Але я рекомендую не використовувати його для сценарію рівня виробництва.
Ondra Žižka

25

Використовуйте csvkit :

csvjoin -c email id_email.csv email_name.csv

або

csvjoin -c 2,1 id_email.csv email_name.csv

4
Чому це не найкраща відповідь?
alexg

дивовижний інструмент. Навіть визнав, що один з моїх файлів має роздільник "", що відрізняється від "".
D_K

6

Можливо, це надмірно, але ви можете імпортувати в базу даних (наприклад, OpenOffice Base) у вигляді двох видів таблиць і визначити звіт, який є бажаним результатом.

Якщо імпорт CSV є проблемою, то імпорт може виконати програма електронних таблиць (наприклад, OpenOffice Calc). Потім результат можна легко перенести в базу даних.


4

У майбутньому ви можете скористатися AWK . Це дуже проста маленька мова сценаріїв, яка існує в якійсь формі в кожній * nix системі, і її єдиною місією є життя - це маніпулювання стандартними текстовими базами даних, що розмежовуються. За допомогою декількох рядків сценарію викидання ви можете зробити дуже корисні речі. Мова невелика та елегантна та має кращі співвідношення корисності та складності, ніж усе, що мені відомо.


Perl багато в чому наступник awk.
reinierpost

Наскільки я знаю, awk не справляється з цитуванням та скасуванням (наприклад, з обробкою, s у розділеному CSV-файлі). Якщо вам це потрібно, використовувати спеціалізовану бібліотеку обробки CSV простіше; вони існують для багатьох мов.
reinierpost

0

Використовуйте Go: https://github.com/chrislusf/gleam

package main

import (
    "flag"
    "os"

    "github.com/chrislusf/gleam"
    "github.com/chrislusf/gleam/source/csv"
)

var (
    aFile = flag.String("a", "a.csv", "first csv file with 2 fields, the first one being the key")
    bFile = flag.String("b", "b.csv", "second csv file with 2 fields, the first one being the key")
)

func main() {

    flag.Parse()

    f := gleam.New()
    a := f.Input(csv.New(*aFile))
    b := f.Input(csv.New(*bFile))

    a.Join(b).Fprintf(os.Stdout, "%s,%s,%s\n").Run()

}

0

Спробуйте CSV Cruncher .

Він приймає файли CSV як таблиці SQL, а потім дозволяє запити SQL, в результаті чого виникає інший файл CSV або JSON.

Для вашого випадку ви просто зателефонуєте:

crunch -in tableA.csv tableB.csv -out output.csv \
   "SELECT tableA.id, tableA.email, tableB.name 
    FROM tableA LEFT JOIN tableB USING (email)"

Інструменту потрібна Java 8 або новіша версія.

Деякі з переваг:

  • Ви дійсно отримуєте підтримку CSV, а не просто "припустимо, що дані правильні".
  • Ви можете приєднатися до кількох клавіш.
  • Простіші у використанні та розумінні joinрішення, ніж на базі даних.
  • Ви можете комбінувати більше 2 файлів CSV.
  • Ви можете приєднатись до SQL-виразів - значення не повинні бути однаковими.

Відмова: Я написав цей інструмент. Раніше він був у занепокоєнні після закриття коду Google, але я відновив його та додав нові функції під час його використання.


0

Ви можете прочитати файл CSV за допомогою програми електронних таблиць на зразок LibreOffice і використовувати VLOOKUP()макрос для пошуку імені у другому файлі.


7
Розширення файлу xlsx передбачає Microsoft Excel, і я думаю, що VLOOKUP також працює. Це питання позначено тегами Linux. Чи доступний Microsoft Excel для Linux?
Пітер Мортенсен

Тепер у LibreOffice також є VLOOKUP .
Крістіан Цюпіту

-1

Ви також можете скористатися інструментом, спеціально розробленим для приєднання файлів CSV, наприклад, знайденим на https://filerefinery.com

Зараз ми підтримуємо такі операції: приєднання файлів CSV. Можна виконати еквівалент SQL зовнішніх, внутрішніх, лівих та правих операцій з'єднання на двох файлах csv. Котрий стовпець буде використовуватися як ключ з'єднання у кожному з файлів, який можна налаштувати.


Будь ласка, цитуйте основні частини відповіді із посилальних посилань (ив), оскільки відповідь може стати недійсною, якщо змінена пов’язана сторінка.
DavidPostill

Більше не існує.
Ондра Жижка
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.