Предположим, у вас есть один файл CSV с 2 полями: идентификатор и адрес электронной почты. У вас есть другой файл с 2 полями: адрес электронной почты и имя. Как вы можете создать файл со всеми тремя полями, объединенными по электронной почте?
8 ответов
Редакция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 , : ',' is the field separator -k 2,2 : character sort on 2nd field -k 1,1 : character sort on 1st field -1 2 : file 1, 2nd field -2 1 : file 2, 1st field > : output to file
производит
email,ID,name email,ID,name ...
отсортировано по электронной почте в алфавитном порядке.
Обратите внимание, что если в каком-либо файле отсутствует какое-либо письмо, оно будет опущено в результатах.
Используйте csvkit:
csvjoin -c email id_email.csv email_name.csv
или же
csvjoin -c 2,1 id_email.csv email_name.csv
Возможно, это излишне, но вы можете импортировать в базу данных (например, OpenOffice Base) в виде двух видов таблиц и определить отчет, который является желаемым результатом.
Если импорт CSV является проблемой, то программа для работы с электронными таблицами (например, OpenOffice Calc) может выполнить импорт. Результат может быть легко перенесен в базу данных.
В будущем вы можете начать играть с AWK. Это очень простой маленький скриптовый язык, который существует в той или иной форме в каждой системе * nix, и его единственная миссия - жизнь - это манипуляции со стандартными текстовыми базами данных с разделителями. С помощью нескольких строк одноразового скрипта вы можете делать очень полезные вещи. Язык небольшой и элегантный и имеет лучшее соотношение полезности и сложности, чем все, что я знаю.
Попробуйте 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, но я восстановил его и добавил новые функции по мере его использования.
Вы можете прочитать CSV-файл с помощью программы для работы с электронными таблицами, такой как LibreOffice, и использовать макрос VLOOKUP()
для поиска имени во втором файле.
Используйте 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()
}
Вы также можете использовать инструмент, специально разработанный для объединения CSV-файлов, такой как найденный на https://filerefinery.com.
В настоящее время мы поддерживаем следующие операции: Присоединение CSV-файлов. Можно выполнить SQL-эквивалент внешних, внутренних, левых и правых операций соединения для двух файлов CSV. Какой столбец будет использоваться в качестве ключа объединения в каждом из файлов, настраивается.