Объедините два текстовых файла, разделенных табуляцией - PullRequest
0 голосов
/ 16 сентября 2018

У меня есть две табуляции с заголовком.

Файл1 имеет 11 столбцов

Col1    Col2    Col3    Col4    Col5    Col6    Col7    Col8    Col9    Col10   Col1

1   NH1 NH1 Unknown 149578  B2                  202410200023_R02C02

2   NH2 NH2 Unknown 149578  A4                  202410200023_R04C01

10  NH10    NH10    Unknown 149578  A1                  202410200023_R01C01

11  BU51    BU51    Unknown 149578  B3                  202410200023_R03C02

12  BU52    BU52    Unknown 149578  A6                  202410200023_R06C01

Файл2 содержит 4, 5 или более столбцов.

Col1    Col2    Col3    Col4    Col5

BU51    149578  BU51    Unknown 1

BU52    149578  BU52    Unknown 1

NH1 149578  NH1 Unknown 1

NH2 149578  NH2 Unknown 1

Я пытаюсь сделать вывод со столбцами 2-4 из файла 1 и столбцами 4 и 5 из файла2.Но col2 или col3 из file1 должны совпадать с col1 или col2 из file2.Столбцы вывода могут иметь новые местоположения.Например, column2 из file1 может быть расположен в column1 в выходных данных

Я пытаюсь найти ответ из Как сравнить и объединить несколько файлов? Я не уверен, почему линия foreach my $key (keys %ref){ push( @{$ref{$key} }, $current{key}} не может работать хорошо.

1 Ответ

0 голосов
/ 18 сентября 2018

Ваш critera объединения немного сбивает с толку file2.col2 не имеет ничего общего с file1.col2 или file1.col3 ... Вы имели в виду file2.col3?И у вас нет образца вывода, поэтому мы точно знаем, что вы ищете.

Но я думаю, что это сработает.Он использует вышеупомянутый модуль DBD :: CSV для чтения ваших файлов tsv и присоединения к ним, а также DBIx :: TSV для форматирования вывода.Оба доступны через ваш любимый клиент CPAN.

#!/usr/bin/perl
use warnings;
use strict;
use DBI;
use DBIx::TSV;

my $dbh = DBI->connect("dbi:CSV:", undef, undef,
                       {csv_tables => {
                                       "file1" => { f_file => "file1.tsv" },
                                       "file2" => { f_file => "file2.tsv" }
                                      },
                        csv_sep_char => "\t"
                       }) or die $DBI::errstr;

print $dbh->selectall_tsv(<<EOQ);
SELECT f1.col2 AS Col1, f1.col3 AS Col2, f1.col4 AS Col3, f2.col4 AS Col4, f2.col5 AS Col5
FROM file1 AS f1
   , file2 AS f2
WHERE f1.col2 = f2.col1 OR f1.col2 = f2.col3 OR f1.col3 = f2.col1 OR f1.col3 = f2.col3
EOQ
$dbh->disconnect;

, который печатает

Col1    Col2    Col3    Col4    Col5
NH1 NH1 Unknown Unknown 1
NH2 NH2 Unknown Unknown 1
BU51    BU51    Unknown Unknown 1
BU52    BU52    Unknown Unknown 1

(SO форматирование не очень хорошо работает с вкладками)

Есть и другие способыЯ уверен, что делать это, но когда вы начинаете говорить о соединении строк разных файлов на основе общих полей, а затем только отображать определенные поля ... это просто кричит реляционные данные, а SQL - мой обычный способ обработки, даже безфактическая база данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...