2014-01-29 2 views
0

У меня есть два CSV файлы с именемСравнение двух файлов CSV, соответствующие и слияние с помощью Perl

alexa_products.csv

name,   sku,  urle,  product, data 

amazon, amazon.com, current, mobile, seller 

vinnes, vinnes.com, current, cellular, Aircel_Indore 

data.csv

name,   sku,  urle, product, data 

linkedin.com, linkeidn, current, local,  blah 

airtel.com, airtel, current, sim,  Airtel 

amazon.com, amazon, face, network, buyier 

vinnes.com, vinnes, look, hands,  ddde 

Теперь я должен совпадать с именем из alexa_products .csv и sku из data.csv, если есть какое-либо совпадение, и я должен распечатать все данные только из определенного столбца из двух файлов csv в другой файл csv ?

Ожидаемого выход

amazon.com, amazon, face, network, buyier, current, mobile, seller 

vinnes.com, vinnes, look, hands,  ddde, current, cellular, Aircel_Indore 
+0

Пожалуйста, покажите нам ожидаемый результат. –

+0

@MarkSetchell Привет, я обновил ожидаемый результат по запросу ur –

ответ

0

Вы могли бы попробовать что-то вдоль этих линий:

sed "1d;s/ //g" alexa_products.csv | sort > a 
sed "1d;s/ //g" data.csv | sort > b 
join -t, -1 1 -2 2 a b > newfile.csv 

Да, я знаю, что это не очень хорошо Perl ;-)

"СЭД" команда удаляет строку заголовка (строка 1) и все пробелы из alexa_products.csv. Затем остаток файла сортируется с помощью «сортировки» и сохраняется как файл «a».

Аналогично, файл «data_products» имеет свой заголовок и пробелы, удаляется, сортируется и сохраняется в файле «b».

Затем «join» использует поле 1 файла «a» и сопоставляет его с полем «2» в файле b и печатает, где они совпадают.

Вы можете использовать команду «man sed» или «man join», чтобы прочитать инструкции к командам - ​​нажмите ПРОБЕЛ, чтобы получить следующую страницу, и «q», чтобы выйти из чтения.

+0

Что это за код, вы можете объяснить этот код? –

+0

Я отредактирую его, держись. –

+0

Он работает и как сохранить это в другом файле? –

0

Поскольку вы не упомянули о столбцах, которые вас интересуют, я просто сказать, эта команда будет печатать все столбцы второго файла, если есть совпадение с первым файлом.

awk -F, 'FNR==NR && NR!=1 && FNR!=1 
     { 
     a[$1]=$0;next 
     }{if($2 in a) 
      { 
      split(a[$2],b," "); 
      print $0,b[3],b[4],b[5] 
      } 
     }' alexa_products.csv data.csv 
+0

Привет, спасибо за ответ, пожалуйста, просмотрите обновленные ожидаемые результаты в основном содержании –

0

Для этого вам понадобится Perl, чтобы начать игру, просто для пинков!

#!/usr/bin/perl 
use strict; 
use warnings; 
use Data::Dumper; 

my %alexa; 
my ($name,$sku,$urle,$product,$data); 

# Parse first file 
my $line=1; 
open(my $fh,"<","alexa_products.csv")|| die "ERROR: Could not open alexa_products.csv"; 
while (<$fh>) 
{ 
    next if $line++==1; # Ignore header 
    chomp;  # Remove LF 
    s/ //g;  # Remove spaces 
    ($name,$sku,$urle,$product,$data) = split(','); # Split line on commas 
    $alexa{$name}{'sku'}=$sku; 
    $alexa{$name}{'urle'}=$urle; 
    $alexa{$name}{'product'}=$product; 
    $alexa{$name}{'data'}=$data; 
} 
close($fh); 

# Next line for debugging, comment out if necessary 
print Dumper \%alexa; 

# Now read data file 
$line=1; 
open($fh,"<","Data.csv")|| die "ERROR: Could not open Data.csv"; 
while(<$fh>) 
{ 
    next if $line++==1;  # Ignore header line 
    chomp;   # Remove LF 
    s/ //g;   # Remove spaces 

    my ($name,$sku,$urle,$product,$data) = split(','); # Split line on commas 
    if(defined $alexa{$sku}){ 
     print "$alexa{$sku}{'sku'},$alexa{$sku}{'data'},$alexa{$sku}{'product'}\n"; # You may want different fields 
    } 
} 
Смежные вопросы