매우 큰 CSV에 다음 데이터가 있습니다.
"sortorder","name","description"
"1","B.1","Boiler room"
"2","1.1","First office"
"3","1.2","Second office"
etc...
나는 다음과 같이 끝내고 싶습니다.
{ name => 'B.1', description => 'Boiler room', sortorder => 1 },
{ name => '1.1', description => 'First office', sortorder => 2 },
{ name => '1.2', description => 'Second office', sortorder => 3 },
etc.
Perl이나 Bash를 사용하여 이를 어떻게 달성할 수 있나요?
답변1
일반적인sed솔루션(필드를 사용하지 않음)
sed '
1{
h
d
}
G
:a
s/\(^\|,\)\([^=]\+\n\)"\?\([^,]\+\)"\?,\?/\1 \3 => \2/
ta
s/^/{/
s/\n/ },/
' file.csv
하지만 Riot Realm을 마지막 영역으로 만들고 싶다면 추가하세요.
s/\([^,]*\), \([^\n]*\)/\2, \1/
뒤쪽에ta
답변2
약간의 루비 원 라이너
ruby -rcsv -ne '
row = CSV.parse_line($_)
if $. == 1 then
keys = row
else
h = Hash[keys.zip(row)]
puts h.to_s + ","
end
'
산출
{"sortorder"=>"1", "name"=>"B.1", "description"=>"Boiler room"},
{"sortorder"=>"2", "name"=>"1.1", "description"=>"First office"},
{"sortorder"=>"3", "name"=>"1.2", "description"=>"Second office"},
또는 Perl, 완전한 데이터 구조(해시 배열) 생성
use strict;
use warnings;
use v5.10;
use Text::CSV;
use autodie;
use Data::Dump qw/ dump /;
my @rows;
open my $fh, "<", shift @ARGV;
my $csv = Text::CSV->new( {binary => 1} );
my $keys = $csv->getline($fh);
while (my $row = $csv->getline($fh) ) {
my %h;
@h{ @$keys } = @$row;
push @rows, \%h;
}
# print it
say dump \@rows;
산출
[
{ description => "Boiler room", name => "B.1", sortorder => 1 },
{ description => "First office", name => 1.1, sortorder => 2 },
{ description => "Second office", name => 1.2, sortorder => 3 },
]
답변3
펄 스크립트 사용
#!/usr/bin/perl
open INFILE, "<", "inputfile";
open OUTFILE, ">", "outputfile";
$header_line = <INFILE>;
chop($header_line);
@headers = split /,/, $header_line;
foreach $header_column (@headers) {
$header_column =~ s/^"(.*)"$/$1/;
}
while(<INFILE>) {
chop($_); # clear the newline at the end of string
@fields = split /,/; # split string by ,
foreach $field (@fields) {
$field =~ s/^"(.*)"$/$1/;
}
for($i = 0; $i <= $#headers; $i++) {
$fields[$i] = $headers[$i] . " => " . $fields[$i];
}
print OUTFILE "{ " . join(', ', @fields) . "},\n";
}
그리고 당신 것inputfile
"sortorder","name","description"
"1","B.1","Boiler room"
"2","1.1","First office"
"3","1.2","Second office"
산출물을 생산하다
{ name => 'name', description => 'description', sortorder => 'sortorder' },
{ name => 'B.1', description => 'Boiler room', sortorder => '1' },
{ name => '1.1', description => 'First office', sortorder => '2' },
{ name => '1.2', description => 'Second office', sortorder => '3' },
스크립트는 첫 번째 행부터 시작하여 열 순서를 유지합니다.