19

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

8 ответов8

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 ,   : ',' 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
...

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

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

20

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

csvjoin -c email id_email.csv email_name.csv

или же

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

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

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

4

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

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() для поиска имени во втором файле.

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()

}
-1

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .