Как объединить строки в CSV?

98
13

У меня есть файл CSV с тремя полями с разделителями-запятыми, которые выглядят следующим образом:

THIS_IS_A_RECORD,email1domain.com;,email@domain.com;
,,email@domain.com;
,,email@domain.com;
,,email@domain.com;
,,email@domain.com;
,,email@domain.com;
,,email@domain.com;
ANOTHER_RECORD,email1domain.com;,email@domain.com;
,,email@domain.com;
,,email@domain.com;
,,email@domain.com;
,,email@domain.com;
,,email@domain.com;
,,email@domain.com;
,,email@domain.com;
,,email@domain.com;
,,email@domain.com;
,,email@domain.com;
,,email@domain.com;
,,email@domain.com;

Я хотел бы объединить строки, чтобы мой вывод выглядел так:

THIS_IS_A_FIELD,email1domain.com;,email@domain.com;email@domain.com;email@domain.com;email@domain.com;email@domain.com;email@domain.com;email@domain.com;
ANOTHER_FIELD,email1domain.com;,email@domain.com;email@domain.com;email@domain.com;email@domain.com;email@domain.com;email@domain.com;email@domain.com;email@domain.com;email@domain.com;

Третье поле от ,email@domain.com; строки должны быть добавлены в конец последней полной записи. Моя цель - импортировать вывод в базу данных MySQL.

спросил(а) 2014-02-28T22:28:00+04:00 7 лет, 1 месяц назад
1
Решение
86

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

use strict;
use warnings;

my %data;
my @labels;

while (<>) {
chomp;
my ($label, @emails) = split /,/;
@emails = grep $_, @emails;
push @labels, $label if $label;
push @{ $data{ $labels[-1] } }, @emails if @labels;
}

print join(',', $_, @{ $data{$_} }), "\n" for @labels;

вывод

THIS_IS_A_RECORD,email1domain.com;,email@domain.com;,email@domain.com;,email@domain.com;,email@domain.com;,email@domain.com;,email@domain.com;,email@domain.com;
ANOTHER_RECORD,email1domain.com;,email@domain.com;,email@domain.com;,email@domain.com;,email@domain.com;,email@domain.com;,email@domain.com;,email@domain.com;,email@domain.com;,email@domain.com;,email@domain.com;,email@domain.com;,email@domain.com;,email@domain.com;

ответил(а) 2014-03-01T01:47:00+04:00 7 лет, 1 месяц назад
44

awk -F, '
length($1) {if (line) print line; line=""}
{line = line $0}
END {if (line) print line}
' file

ответил(а) 2014-03-01T00:17:00+04:00 7 лет, 1 месяц назад
44

Учитывая ваш набор данных, следующее будет делать то, что вы хотите:

perl -pe 'chomp; print "\n" if /^[^,]/ && $. > 1; s/,//g if /^,/' inFile > outFile

Надеюсь это поможет!

ответил(а) 2014-03-01T00:17:00+04:00 7 лет, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема