Как объединить два файла CSV?

22

Предположим, у вас есть один файл CSV с 2 полями: идентификатор и адрес электронной почты. У вас есть другой файл с 2 полями: адрес электронной почты и имя. Как вы можете создать файл со всеми тремя полями, объединенными по электронной почте?

crst53
источник
5
Немного подробнее о соединении (т. Е. Внутреннем, внешнем, левом). Список электронной почты в первом CSV идентичен второму списку? Или один содержит больше?
HyperSlug
Примеры файлов CSV были бы полезны, наряду с ОС, которую вы используете?
Troggy
Я думаю, что 1-й и 2-й список идентичны. Я использую Linux. Пожалуйста помоги!!! Благодарность!! :)
crst53
1
насколько велики данные?
Джошуа

Ответы:

24

Редакция 3 :

Вы должны отсортировать оба списка по электронной почте в алфавитном порядке, а затем присоединиться. Учитывая, что в поле электронной почты 2-е поле файла1 и 1-е поле файла2:

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-е поле
>: вывод в файл

производит

электронная почта, ID, имя
электронная почта, ID, имя
...

отсортировано по электронной почте в алфавитном порядке.

Обратите внимание, что если в каком-либо файле отсутствует какое-либо письмо, оно будет опущено в результатах.

hyperslug
источник
2
CSV сложнее, чем это. Разделитель поля может быть экранирован, например.
pguardiario
@hyperslug я могу сделать полное внешнее соединение?
Абу Шоеб
Это не будет работать, если CSV смешан в кавычках / без кавычек, если идентификатор содержит запятую. Используйте это решение только для одноразовой обработки, где вы проверяете результат. Но я рекомендую не использовать его для сценария производственного уровня.
Ондра Жижка
25

Используйте csvkit :

csvjoin -c email id_email.csv email_name.csv

или

csvjoin -c 2,1 id_email.csv email_name.csv
Tgr
источник
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()

}
chrislusf
источник
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 Code, но я восстановил его и добавил новые функции по мере его использования.

Ондра Жижка
источник
0

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

Янек
источник
7
Расширение файла xlsx подразумевает Microsoft Excel, и я думаю, что VLOOKUP делает то же самое. Этот вопрос связан с Linux. Доступен ли Microsoft Excel для Linux?
Питер Мортенсен
Теперь у LibreOffice есть и VLOOKUP .
Кристиан Чиупиту
-1

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

В настоящее время мы поддерживаем следующие операции: Присоединение CSV-файлов. Можно выполнить SQL-эквивалент внешних, внутренних, левых и правых операций соединения для двух файлов CSV. Какой столбец будет использоваться в качестве ключа объединения в каждом из файлов, настраивается.

Liket
источник
Пожалуйста, процитируйте основные части ответа по ссылочной ссылке (ссылкам), так как ответ может стать недействительным, если связанные страницы изменятся.
DavidPostill
Более не существует.
Ондра Жижка