У меня есть файл csv. И мне нужно создать из него еще один файл. Файл csv выглядит следующим образом
Signal Start,PK_SIG_NME,PK_SIGNALS_WIDTH,DESIGN_SIG_NME(exact string),, ,HRESETn ,1,~dcc_ares,, ,HCLK,1,dcc_clk,, ,HADDR, [31:0],i_dcc_qhs_haddr, etc
И желаемый результат:
.HRESETn(~dcc_ares), .HCLK(dcc_clk), .HADDR(i_dcc_qhs_haddr)
Для лучшей поддержки CSV используйте perl и Text::CSV
#!/usr/bin/perl
use strict;
use warnings;
use Text::CSV;
my $file = $ARGV[0];
open my $fh, "<", $file or die "$file: $!";
my $csv = Text::CSV->new ({
binary => 1,
auto_diag => 1,
# uncomment the line below to avoid leading and trailing whitespaces
allow_whitespace => 1,
sep_char => ','
});
while (my $row = $csv->getline ($fh)) {
print ".$row->[6]($row->[8]), ";
print ".$row->[11]($row->[13]), ";
print ".$row->[16]($row->[18])\n";
}
close $fh;
Сохраните файл как ./getit, chmod +x getit и запустите с помощью ./getit input.csv
Пример вывода
.HRESETn(~dcc_ares), .HCLK(dcc_clk), .HADDR(i_dcc_qhs_haddr)
Если вы получите сообщение об ошибке, подобное этому:
"use Text::CSV;" - Can't locate Text/CSV.pm
Установите правый модуль через :
sudo apt-get install libtext-csv-perl
или
perl -MCPAN -e'install Text::CSV'
Другой способ сделать это с awk:
awk 'BEGIN{RS=","} /HRESETn/||/HCLK/||/HADDR/{var=$0; printf "."var;getline;getline;printf "("$0")"; if(var != "HADDR") printf RS}' cvsfile.cvs
Объяснение
рассматривать запятую как разделитель записи. Найдите все поля, которые являются HRESETn или HCLK или HADDR, распечатайте их, чтобы напечатать вторую запись после согласованной строки с фигурными скобками вокруг них. Проверьте, было ли HADDR последним, что мы напечатали, если это не было добавление комы в конце (это для устранения конечных комов)Объяснение
$ awk 'BEGIN{RS=","} /HRESETn/||/HCLK/||/HADDR/{var=$0; printf "."var;getline;getline;printf "("$0")"; if(var != "HADDR") printf RS}' cvsfile.cvs
.HRESETn (~dcc_ares),.HCLK(dcc_clk),.HADDR(i_dcc_qhs_haddr)
Вот решение python:
#!/usr/bin/env python2
with open('/path/to/file.csv') as f:
for line in f:
parts = line.split(',')
print '.' + parts[6].rstrip() + '(' + parts[8] + ')' + ', .' + parts[11] + \
'(' + parts[13] + ')' + ', .' + parts[16] + '(' + parts[18] + ')'
Этот скрипт будет читать файл csv по строке. Затем он разбивает файл на части на , (line.split(',')). Тогда мы напечатали необходимые детали в желаемом формате. Выход:
.HRESETn(~dcc_ares), .HCLK(dcc_clk), .HADDR(i_dcc_qhs_haddr)