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


22

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


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, имя
...

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

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


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

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


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.