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

21539
crst53

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

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

8 ответов на вопрос

23
hyperslug

Редакция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, имя ... 

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

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

CSV сложнее, чем это. Разделитель полей может быть экранирован, например. pguardiario 7 лет назад 1
@hyperslug я могу сделать полное внешнее соединение? Abu Shoeb 6 лет назад 0
Это не будет работать, если CSV смешан в кавычках / без кавычек, если идентификатор содержит запятую. Используйте это решение только для одноразовой обработки, где вы проверяете результат. Но я рекомендую не использовать его для сценария производственного уровня. Ondra Žižka 5 лет назад 0
18
Tgr

Use csvkit:

csvjoin -c email id_email.csv email_name.csv 

or

csvjoin -c 2,1 id_email.csv email_name.csv 
Почему это не лучший ответ? alexg 8 лет назад 3
офигенный инструмент. Даже признал, что один из моих файлов имеет отличающийся от "," разделитель. D_K 5 лет назад 0
6
Peter Mortensen

Возможно, это излишне, но вы можете импортировать в базу данных (например, OpenOffice Base) в виде двух видов таблиц и определить отчет, который является желаемым результатом.

Если импорт CSV является проблемой, то программа для работы с электронными таблицами (например, OpenOffice Calc) может выполнить импорт. Результат может быть легко перенесен в базу данных.

4
jim in austin

В будущем вы можете начать играть с AWK . Это очень простой маленький скриптовый язык, который существует в той или иной форме в каждой системе * nix, и его единственная миссия - жизнь - это манипуляции со стандартными текстовыми базами данных с разделителями. С помощью нескольких строк одноразового скрипта вы можете делать очень полезные вещи. Язык небольшой и элегантный и имеет лучшее соотношение полезности и сложности, чем все, что я знаю.

Perl во многих отношениях является преемником awk. reinierpost 13 лет назад 0
Насколько я знаю, awk не обрабатывает кавычки и экранирование (например, имеет дело с s в файле CSV). Если вам это нужно, проще использовать выделенную библиотеку обработки CSV; они существуют для многих языков. reinierpost 13 лет назад 0
0
Janek

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

Расширение файла xlsx подразумевает Microsoft Excel, и я думаю, что VLOOKUP делает то же самое. Этот вопрос связан с Linux. Microsoft Excel доступен для Linux? Peter Mortensen 13 лет назад 7
Теперь в LibreOffice также есть [VLOOKUP] (https://help.libreoffice.org/Calc/Spreadsheet_Functions#VLOOKUP). Cristian Ciupitu 9 лет назад 0
0
chrislusf

Используйте 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
Ondra Žižka

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

-1
liket

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

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

Пожалуйста, процитируйте основные части ответа по ссылочной ссылке (ссылкам), так как ответ может стать недействительным, если связанные страницы изменятся. DavidPostill 6 лет назад 0
Более не существует. Ondra Žižka 5 лет назад 0

Похожие вопросы